c#多线程socket开发(一个服务器对多个客户端).docxVIP

c#多线程socket开发(一个服务器对多个客户端).docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
下面直接讲多线程服务器端开发。 (直接给代码和解释吧) 首先定义一个新类,用于传递(连接 socket )和接受发送数据。 class ClientThread { Encoding encoding = Encoding.GetEncoding(GB2312); // 解码器(可以用于汉字) private Socket client; private string data = null; private byte[] receiveBytes = new byte[1024];// 服务器端设置缓冲区 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.AddressList[0].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 个线程,会对程序性能以及计算机性能影响很大。下面用线程池的方 法对线程进行线程管理(限制最大的线程数,把空闲的线程重新使用,以提高性能) 。 使用 .socket 命名空间下的 threadpool 类。 Thread newthread = new Thread(new ThreadStart(newclient.ClientServer)); newthread.Start(); 将以上程序代码换成 threadpool 的静态方法 QueueUserWorkItem(这个方法默认最 多能有 25 个线程,你可以根据你自己的需要进行设置,这里不详说了) : ThreadP

文档评论(0)

明若晓溪 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档