C#中Socket通信编程的同步实现

本文通过分析和总结C#中Socket通信编程的关键技术,按照同步实现的方式实现了一个简单的Socket聊天程序,目的是通过这个程序来掌握Socket编程,为进一步开发Unity3D网络游戏打下一个坚实的基础。

Socket编程基础

关于Socket编程基础部分的内容,主要是了解和掌握.NET框架下为Socket编程提供的相关类和接口方法。.NET中常见的网络相关的API都集中在System.Net和System.Net.Socket这两个命名空间下,大家可以通过MSDN去了解这两个命名空间下相关的类和方法。这里援引一位朋友总结的一篇文章,大家可以从这里获得更为直观的认识。

什么是Socket编程的同步实现

本文的目的是按照同步实现的方式来实现一个简单的Socket聊天程序,因此在解决这个问题前,我们首先来看看什么是Socket编程的同步实现。所谓Socket编程的同步实现就是指按照同步过程的方法来实现Socket通信。从编程来说,我们常用的方法或者函数都是同步过程。因为当我们调用一个方法或者函数的时候我们能够立即得到它的返回值。可是我们知道在Socket通信中,我们不能保证时时刻刻连接都通畅、更不能够保证时时刻刻都有数据收发,因为我们就需要不断去读取相应的值来确定整个过程的状态。这就是Socket编程的同步实现了,下面我们来看具体的实现过程。

如何实现Socket同步通信服务端

服务端的主要职责是处理各个客户端发送来的数据,因此在客户端的Socket编程中需要使用两个线程来循环处理客户端的请求,一个线程用于监听客户端的连接情况,一个线程用于监听客户端的消息发送,当服务端接收到客户端的消息后需要将消息处理后再分发给各个客户端。

基本流程代码示例using System;using System.Collections.Generic;using System.Text;using System.Net;using System.Net.Sockets;using System.Threading;namespace TCPLib{public class TCPServer{[1024];最大的监听数量maxClientCount;public int MaxClientCount{get { return maxClientCount; }set { maxClientCount = value; }}IP地址ip;public string IP{get { return ip; }set { ip = value; }}端口号port;public int Port{get { return port; }set { port = value; }}客户端列表List<Socket> mClientSockets;public List<Socket> ClientSockets{get { return mClientSockets; }}IP终端IPEndPoint ipEndPoint;服务端SocketSocket mServerSocket;当前客户端SocketSocket mClientSocket;public Socket ClientSocket{get { return mClientSocket; }set { mClientSocket = value; }}构造函数端口号监听的最大树目(int port, int count){this.ip = IPAddress.Any.ToString();this.port = port;this.maxClientCount=count;this.mClientSockets = new List<Socket>();//初始化IP终端this.ipEndPoint = new IPEndPoint(IPAddress.Any, port);//初始化服务端Socketthis.mServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//端口绑定this.mServerSocket.Bind(this.ipEndPoint);//设置监听数目this.mServerSocket.Listen(maxClientCount);}构造函数ip地址端口号监听的最大数目(string ip,int port,int count){this.ip = ip;this.port = port;this.maxClientCount = count;this.mClientSockets = new List<Socket>();//初始化IP终端this.ipEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);//初始化服务端Socketthis.mServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//端口绑定this.mServerSocket.Bind(this.ipEndPoint);//设置监听数目this.mServerSocket.Listen(maxClientCount);}定义一个Start方法将构造函数中的方法分离出来(){//创建服务端线程,实现客户端连接请求的循环监听var mServerThread = new Thread(this.ListenClientConnect);//服务端线程开启mServerThread.Start();}监听客户端链接(){//设置循环标志位bool flag = true;while (flag){//获取连接到服务端的客户端this.ClientSocket = this.mServerSocket.Accept();//将获取到的客户端添加到客户端列表this.mClientSockets.Add(this.ClientSocket);//向客户端发送一条消息this.SendMessage(string.Format(“客户端{0}已成功连接到服务器”, this.ClientSocket.RemoteEndPoint));//创建客户端消息线程,实现客户端消息的循环监听var mReveiveThread = new Thread(this.ReceiveClient);mReveiveThread.Start(this.ClientSocket);}}接收客户端消息的方法(object obj){mClientSocket = (Socket)obj;// 循环标志位bool flag = true;while (flag){try{//获取数据长度int receiveLength = mClientSocket.Receive(result);//获取客户端消息string clientMessage = Encoding.UTF8.GetString(result, 0, receiveLength);//服务端负责将客户端的消息分发给各个客户端this.SendMessage(string.Format(“客户端{0}发来消息:{1}”,mClientSocket.RemoteEndPoint,clientMessage));}catch (Exception e){//从客户端列表中移除该客户端this.mClientSockets.Remove(mClientSocket);//向其它客户端告知该客户端下线this.SendMessage(string.Format(“服务器发来消息:客户端{0}从服务器断开,断开原因:{1}”,mClientSocket.RemoteEndPoint,e.Message));//断开连接mClientSocket.Shutdown(SocketShutdown.Both);mClientSocket.Close();break;}}}向所有的客户端群发消息message(string msg){//确保消息非空以及客户端列表非空if (msg == string.Empty || this.mClientSockets.Count <= 0) return;.mClientSockets){(s as Socket).Send(Encoding.UTF8.GetBytes(msg));}}向指定的客户端发送消息ipportmessage(string ip,int port,string msg){//构造出一个终端地址IPEndPoint _IPEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);//遍历所有客户端foreach (Socket s in mClientSockets){if (_IPEndPoint == (IPEndPoint)s.RemoteEndPoint){s.Send(Encoding.UTF8.GetBytes(msg));}}}}}人性最可怜的就是:我们总是梦想着天边的一座奇妙的玫瑰园,

C#中Socket通信编程的同步实现

相关文章:

你感兴趣的文章:

标签云: