小弟最近在做一个socket通讯的东西,服务器端实现侦听到一个连接请求就产生一个线程与其通讯,如今我的代码是这样写的:MyServer = new IPEndPoint(SocketClass.serverIP, Int32.Parse(SocketClass.serverPort));
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(MyServer);
sock.Listen(50);
while (true)
{
     ThreadPool.QueueUserWorkItem(ThreadSocket, (object)sock);
     Thread.Sleep(500);
}private void ThreadSocket(object sock)
       {
           Socket threadSock = ((Socket)sock).Accept();
           if (threadSock.Connected)
           {
               while (true)
               {
                   byte[] recByte = new byte[256];
                   int datalength = threadSock.Receive(recByte, recByte.Length, 0);
                   Array.Resize<byte>(ref recByte, datalength);
                   string ccc = System.Text.ASCIIEncoding.Default.GetString(recByte);
                   threadSock.Send(recByte);
                   Thread.Sleep(500);
               }
           }
       }这样写基本已经可以使用,但是问题是循环中的两句代码在不断地创建线程,有没有更正规一点的方法啊。

解决方案 »

  1.   

    System.Threading.ManualResetEvent resetEvent = new System.Threading.ManualResetEvent(false);MyServer = new IPEndPoint(SocketClass.serverIP, Int32.Parse(SocketClass.serverPort)); 
    sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    sock.Bind(MyServer); 
    sock.Listen(50); 
    while (true) 

         resetEvent.Reset();
         ThreadPool.QueueUserWorkItem(ThreadSocket, (object)sock); 
         //Thread.Sleep(500); 
         resetEvent.WaitOne(); 
    } private void ThreadSocket(object sock) 
           { 
               resetEvent.Set();
               Socket threadSock = ((Socket)sock).Accept(); 
               if (threadSock.Connected) 
               { 
                   while (true) 
                   { 
                       byte[] recByte = new byte[256]; 
                       int datalength = threadSock.Receive(recByte, recByte.Length, 0); 
                       Array.Resize <byte >(ref recByte, datalength); 
                       string ccc = System.Text.ASCIIEncoding.Default.GetString(recByte); 
                       threadSock.Send(recByte); 
                       Thread.Sleep(500); 
                   } 
               } 
           } 
      

  2.   

    把代码分开成几个方法:listen();receive();send();close()等,
    初始化一个bool run=false;
    listen()方法体里,加上这句:run=true
    while (true)改成 while (run)
    close()方法里加上这句:run=false;
    这样行不? 
     
      

  3.   

    我想请问 jeremyyang824 
    加上去的等待与通知的命令有什么有意义啊,我还不是太明白。。
      

  4.   

    我的代码的意思就是 不要每隔一段时间就创建线程,而是等到前面创建的线程被使用时再创建一个线程等待连接
    resetEvent.Reset();的时候waitone等待
    resetEvent.Set(); 的时候waitone继续推荐一篇文章:
    http://www.cnblogs.com/zhenyulu/archive/2004/07/25/27255.html