加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2013-04-22 22:01:35)

下面直接讲多线程服务器端开发。(直接给代码和解释吧)

      首先定义一个新类,用于传递(连接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个线程,会对程序性能以及计算机性能影响很大。下面用线程池的方法对线程进行线程管理(限制最大的线程数,把空闲的线程重新使用,以提高性能)。 

        使用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)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有