服务器端代码:

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.IO; namespace socket通信
{
public partial class SERVER : Form
{
public SERVER()
{
InitializeComponent();
}
Socket socketSend;
private void Form1_Load(object sender, EventArgs e)
{
this.ActiveControl = this.btnListen;
txtaidip.Text = GetIpAdress();
//txtport.Text = "80";
Control.CheckForIllegalCrossThreadCalls = false;
}
//将远程连接的IP地址和Socket存放到集合中
Dictionary<string, Socket> diSocket = new Dictionary<string, Socket>();
private void button1_Click(object sender, EventArgs e)
{
try
{
//创建一个socket,负责监听IP地址和端口号
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtaidip.Text.Trim()); //提供一个IP地址
IPEndPoint point = new IPEndPoint(ip, ); //端口号,其中包括了IP地址 socketWatch.Bind(point); //绑定IP地址和端口
ShowMsg("监听成功");
socketWatch.Listen(); //设置监听队列,最多允许同时10个连接,(0表示不限制) Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWatch); //socketWatch是Listen()的参数
}
catch
{ } } private void ShowMsg(string str)
{
txtReceMsg.AppendText(str + "\r\n");
} /// <summary>
/// //获取本机IP地址
/// </summary>
/// <returns></returns>
private string GetIpAdress()
{
try
{
string HostName = Dns.GetHostName(); //得到主机名
IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
for (int i = ; i < IpEntry.AddressList.Length; i++)
{
//从IP地址列表中筛选出IPv4类型的IP地址
//AddressFamily.InterNetwork表示此IP为IPv4,
//AddressFamily.InterNetworkV6表示此地址为IPv6类型
if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
{
return IpEntry.AddressList[i].ToString();
}
}
return "";
}
catch (Exception ex)
{
return ex.Message;
}
} /// <summary>
/// 解决只能连接一个用户的问题
/// </summary>
private void Listen(Object o)
{
Socket socketWatch = o as Socket;
while (true)
{
try
{
//接下来等待客户端的连接
socketSend = socketWatch.Accept(); //为客户端创建一个负责通信的新的socket并接收来自客户端的请求
//将新的socket存放进集合中
diSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//将远程连接的IP地址和端口号存入下拉框
cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":连接成功"); //192.168.0.103:连接成功
Thread th = new Thread(ReceiveSend);
//开启一个新线程不停接收来自客户端的消息
th.IsBackground = true;
th.Start(socketSend);
}
catch
{ } }
}
/// <summary>
/// 服务器端不停的接收客户端发送过来的消息
/// </summary>
/// <param name="o"></param>
private void ReceiveSend(Object o)
{
Socket socketSend = o as Socket;
while (true)
{
try
{
//客户端连接成功后,服务器应该接受客户端发出的消息
byte[] buffer = new byte[* * ];
int r = socketSend.Receive(buffer); // 实际接收到的有效字节数
if (r == )
{
break;
}
string str = Encoding.UTF8.GetString(buffer, , r); //将字节流转换为string【str就是客户端向服务器发送的字符串】
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str); //远程客户端连接:接收客户端发送的内容 }
catch
{ }
}
} private void btnSendMsg_Click(object sender, EventArgs e)
{ //将服务器端的信息发送给客户端
string str = txtSendMsg.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
//socketSend.Send(buffer);
//获得用户在下拉框中选中的IP地址,根据IP地址找到对应的socket,然后发送消息
string ip = cboUsers.SelectedIndex.ToString();
diSocket[ip].Send(buffer);
txtReceMsg.AppendText(GetIpAdress() + ">>" + txtSendMsg.Text.Trim() + "\r\n");
txtSendMsg.Text = ""; //清空文本框
} //在文本框中输入信息后按【Enter】键,触发【发送消息】事件
private void txtSendMsg_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
btnSendMsg_Click(sender, e);
}
}
}
} 客户端代码:
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading; namespace socket通信客户端
{
public partial class CLIENT : Form
{
public CLIENT()
{
InitializeComponent();
} Socket socketSend;
/// <summary>
/// //获取本机IP地址
/// </summary>
/// <returns></returns>
private string GetIpAdress()
{
try
{
string HostName = Dns.GetHostName(); //得到主机名
IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
for (int i = ; i < IpEntry.AddressList.Length; i++)
{
//从IP地址列表中筛选出IPv4类型的IP地址
//AddressFamily.InterNetwork表示此IP为IPv4,
//AddressFamily.InterNetworkV6表示此地址为IPv6类型
if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
{
return IpEntry.AddressList[i].ToString();
}
}
return "";
}
catch (Exception ex)
{
return ex.Message;
}
} private void Form1_Load(object sender, EventArgs e)
{
//txtlocalip.Text = GetIpAdress();
//txtport.Text = "8080";
Control.CheckForIllegalCrossThreadCalls = false;
this.ActiveControl = this.btnConnection; } private void btnConnection_Click(object sender, EventArgs e)
{
try
{
//创建一个socket用来连接服务器
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtaidip.Text.Trim()); //获取IP地址
IPEndPoint ipep = new IPEndPoint(ip, Convert.ToInt32(txtport.Text.Trim())); //获得要连接的远程服务器的IP地址和端口号
socketSend.Connect(ipep);
showMSG("连接成功");
//创建一个线程,用来不断接收服务器端发送的信息
Thread th = new Thread(ReceiveMessage);
th.IsBackground = true; //后台线程
th.Start(socketSend); //socketSend是Start()的参数
}
catch
{ } } private void showMSG(string str)
{
txtReceMsg.AppendText(str + "\r\n");
} private void btnSendMsg_Click(object sender, EventArgs e)
{
string str = txtSendMsg.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
txtReceMsg.AppendText(GetIpAdress() + ">>" + txtSendMsg.Text.Trim() + "\r\n");
txtSendMsg.Text = "";
} private void txtMsg_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == '\r')
{
this.btnSendMsg_Click(sender, e);
}
}
/// <summary>
/// 不停地接收服务器端发送来的信息
/// </summary>
/// <param name="o"></param>
private void ReceiveMessage(Object o)
{
Socket socketSend = o as Socket;
try
{
while (true)
{
byte[] buffer = new byte[ * * ];
int r = socketSend.Receive(buffer);
if (r == )
{
break;
}
string str = Encoding.UTF8.GetString(buffer, , r);
showMSG(socketSend.RemoteEndPoint.ToString() + ":" + str); }
}
catch
{ } }
} }
 

c#使用Socket实现局域网内通信的更多相关文章

  1. 局域网内python socket实现windows与linux间简单的消息传送

    有个需求,就是在windows上看见一篇介绍linux相关的文章,想在局域网内的另外一台linux电脑上尝试一下, 于是就需要把该网页链接发送给linux,不想一点一点敲链接,又苦于没有找到其它好的方 ...

  2. erlang局域网内节点通信——艰难四步曲 (转)

    http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通 ...

  3. erlang局域网内节点通信——艰难四步曲

    http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通 ...

  4. 局域网内使用ipv6 通信

    链路本地地址:用于网段内通信,不能跨路由访问 在ping本地链路地址和全球唯一地址时有点差别,链路本地地址需要加上网络接口号 Linux 查看ipv6链路本地地址:ifconfig linux系统pi ...

  5. Android基于TCP的局域网聊天通信

    概述 在同一局域网内,两台设备通过TCP进行通信聊天. 详细 代码下载:http://www.demodashi.com/demo/10567.html 一.准备工作 开发环境 jdk1.8 Ecli ...

  6. Android基于UDP的局域网聊天通信

    代码地址如下:http://www.demodashi.com/demo/12057.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1. 开发环境 1.1 开发工具 ...

  7. 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法

    TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...

  8. C#的Socket实现UDP协议通信

    今天稍花化了一点时间,利用C#的Socket验证了UDP的通信,为接下来特地利用UDP做个分布式的通信仿真系统打下基础.众所周知,UDP 就是用户数据报协议,在互联网参考模型的第四层——传输层.与TC ...

  9. 局域网内Linux服务器时间同步

    局域网内Linux服务器时间同步   1.将一台能够上网的服务器作为时间服务器:  # /usr/bin/rdate -s time-b.timefreq.bldrdoc.gov //将时间服务器与互 ...

随机推荐

  1. SwiftStack 因战略转变而裁员

    导读 销售团队在前段圣诞节来临前面临裁减的糟糕处境.企业云存储公司SwiftStack进行了裁员,人数不详,公司规模因此缩小. IT外媒The Register获悉,这家公司裁掉了大概一半的人员,但总 ...

  2. js缓存

    jsp页面加载的js有时候会有缓存 可以给引入的js加一个版本号,-------版本号不一致,会重新加载 <script type="text/javascript" src ...

  3. Codeforces 1304B. Longest Palindrome

    根据数据范围,暴力可以解决,对每一个串,找与其互为回文的串,或者判断自身是否为回文串,然后两两将互为回文的串排列在头尾,中间放且只能最多放一个自身为回文串的串,因为题目说每个串都是不同的 #inclu ...

  4. 记录一次Nginx使用第三方模块fair导致的线上故障排错

    一.问题 今天发现有一台服务器的内存飙升,然后有预警,立即排查,发现该服务内存使用达到了 2G ,询问开发,当天是否有活动,被告知没有,登陆 Pinpoint 发现该服务是有两台机器,并且所有的访问都 ...

  5. 浏览器的HTML页面展示

    当你输入一个url链接发生了什么? 下面的图是上篇文章的改造版本 电脑浏览器输入百度 打开台式电脑或者笔记本中的浏览器(IE,谷歌,360等),访问百度http://www.baidu.com,此时发 ...

  6. Lesson 13 The search for oil

    What do oilmen want to achieve as soon as they strike oil? The deepest holes of all are made for oil ...

  7. Java基于redis实现分布式锁(SpringBoot)

    前言 分布式锁,其实原理是就是多台机器,去争抢一个资源,谁争抢成功,那么谁就持有了这把锁,然后去执行后续的业务逻辑,执行完毕后,把锁释放掉. 可以通过多种途径实现分布式锁,例如利用数据库(mysql等 ...

  8. webpack打包文件中的@符号表示什么意思

    在看使用webpack打包的项目代码时,经常会看到在路径中引用@符号 import one from '@/views/one.vue' 那这里的@符号到底表示什么意思呢? 这其实利用了webpack ...

  9. java并发初探ConcurrentHashMap

    java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...

  10. JavaSwing标准对话框

    package test001; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import jav ...