客户端与服务端通信主要有两种模式,一种是TCP,一种是UDP。
UDP速度最快,客户端只管发送,服务端是能接多少就接多少。一般应用到游戏行业。而TCP会保证两边能接收成功。下面做了一个简单的客户端与服务端通信的软信(聊天软件),以备后查:.
服务端:
1,创建监听端口
IPAddress ip = IPAddress.Any;
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(IPAddress.Any, 1456);//监听端口为1456
socketWatch.Bind(point);
socketWatch.Listen(10);//最多接收10个客户端
textBox3.AppendText("启动服务成功");
2,需设置全局变量:
Socket? socketfwq;//服务端服务
Dictionary<string, Socket> keyValuePairs = new Dictionary<string, Socket>(); //把客户端的保存
要开启多线程监听:Accept()为等侍客户端接收,当有客户端连入时,把属性绑到combox上里,方便多个客户端通话。因为需环循监听,当监听到一个客户端后还要环循接收数据,所以需开启两个Task.Run。
byte[] buffer = new byte[1024];
Task.Run(() =>
{
while (true)
{
socketfwq = socketWatch.Accept();
keyValuePairs.Add(socketfwq.RemoteEndPoint.ToString(), socketfwq);
BeginInvoke(new Action(() =>
{
comboBox1.Items.Add(socketfwq.RemoteEndPoint.ToString());
comboBox1.SelectedItem = socketfwq.RemoteEndPoint.ToString();
}));
Task.Run(() =>
{
while (true)
{
int i = socketfwq.Receive(buffer);
string relust = Encoding.UTF8.GetString(buffer, 0, i);
BeginInvoke(new Action(() =>
{
textBox3.AppendText("\r\n" + relust);
}));
}
});
}
});
3,服务端发送数据给客户端,有多个客户端,所以需选择combox1进行选择,而前面以已经用字典
Dictionary<string, Socket> keyValuePairs = new Dictionary<string, Socket>(); //把客户端的保存
所以直接调用字典发送。
keyValuePairs[comboBox1.SelectedItem.ToString()].Send(Encoding.UTF8.GetBytes(textBox4.Text));
textBox3.AppendText($"\r\n {comboBox1.SelectedItem.ToString()} :" + textBox4.Text);
客户端:
1,设置全局变量:static Socket? ClientSocket;//客户端
用IPAddress.Parse("192.168.254.8")
绑定服务器端,接口1456。connect进行接连。
当连接成功后就告知服务器客户端连接成功,然后就环循环接收数据。
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse("192.168.254.8");
IPEndPoint endPoint = new IPEndPoint(ip, 1456);
ClientSocket.Connect(endPoint);
textBox2.AppendText("连接成功:" + ClientSocket.LocalEndPoint.ToString());
ClientSocket.Send(Encoding.UTF8.GetBytes($"\r\n {ClientSocket.LocalEndPoint.ToString()}:客户端连接成功"));
//comboBox1.Items.Add(ClientSocket.LocalEndPoint);
byte[] buffer = new byte[1024];
Task.Run(() =>
{
while (true)
{
int i = ClientSocket.Receive(buffer);
BeginInvoke(new Action(() =>
{
textBox2.AppendText($"\r\n{ClientSocket.RemoteEndPoint}:" + Encoding.UTF8.GetString(buffer, 0, i));
}));
}
});
2,客户端发送数据到服务端:
ClientSocket.Send(Encoding.UTF8.GetBytes($"{ClientSocket.LocalEndPoint.ToString()}:" + textBox1.Text));
textBox2.AppendText($"\r\n {ClientSocket.LocalEndPoint.ToString()} :" + textBox1.Text);
程序运行如下:
源代码已挂到gitee上面,地址:
https://gitee.com/XiongYunSehng/csharp_socket_learning