资源描述
下面直接讲多线程服务器端开发。(直接给代码和解释吧) 首先定义一个新类,用于传递(连接socket )和接受发送数据。 class ClientThread Encoding encoding = Encoding.GetEncoding(GB2312); /解码器(可以用于汉字) private Socket client; private string data = null; private byte receiveBytes = new byte1024;/服务器端设置缓冲区 private int recCount; /传递连接socket public ClientThread(Socket ClientSocket) this.client = ClientSocket; /数据处理接口 public void ClientServer() try while (true) recCount = client.Receive(receiveBytes, receiveBytes.Length, 0);/从客户端接收信息 if (recCount != 0)/当服务器端的缓冲区接收到的信息不为空时 data = encoding.GetString(receiveBytes, 0, recCount); /接收数据 /接收数据成功后给客户端返回OK client.Send(encoding.GetBytes(OK), 2, 0); else break; catch (Exception ex) Console.Write(出现异常:); Console.WriteLine(ex.ToString(); Console.ReadLine(); client.Close(); 开始服务器端的多线程开发。 string HostName = Dns.GetHostName(); /得到主机名 IPHostEntry IpEntry = Dns.GetHostEntry(HostName); /得到主机IP string strIPAddr = IpEntry.AddressList0.ToString(); IPAddress ip = IPAddress.Parse(strIPAddr); /把ip地址字符串转换为IPAddress IPEndPoint ipep = new IPEndPoint(ip, 9001); /用指定的端口和ip newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); newsock.Bind(ipep);/绑定 newsock.Listen(10);/监听 while (true) try /当有可用的客户端连接尝试时执行,并返回一个新的socket Socket client = newsock.Accept(); /创建消息服务线程对象,并把连接socket赋于ClientThread ClientThread newclient = new ClientThread(client); /把ClientThread 类的ClientService方法委托给线程 Thread newthread = new Thread(new ThreadStart(newclient.ClientServer); / 启动消息服务线程 newthread.Start(); catch /连接中断或者连接失败 这样就完成了多线程socket的开发。一个服务器能对多个客户端:当有客户端要求连接的时候创建新的线程去处理对应的客户端。但是这有一个缺点是,当有N个连接客户端的时候,就有N个线程,会对程序性能以及计算机性能影响很大。下面用线程池的方法对线程进行线程管理(限制最大的线程数,把空闲的线程重新使用,以提高性能)。 使用system.net.socket命名空间下的threadpool类。 Thread newthread = new Thread(new ThreadStart(newclient.ClientServer); newthread.Start(); 将以上程序代码换成threadpool的静态方法 QueueUserWorkItem(这个方法默认最多能有25个线程,你可以根据你自己的需要进行设置,这里不详说了): ThreadPool.QueueUserWorkItem(new WaitCallback(newclient.ClientServer); 这个方法要求被调用的函数至少有一个参数object。比如:public void ClientServer(object 0)
展开阅读全文