2011-03-29 34 views
0

在我的项目中,我使用异步套接字服务器如下。C#异步套接字消息可以等待另一个套接字消息5秒?

for (int i = 0; i < localip.Length; i++) 
       { 
        try 
        { 


         m_mainSocket[1] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
         m_mainSocket[1].Bind(new IPEndPoint(localip[i], port)); 
         m_mainSocket[1].Listen(1000); 
         m_mainSocket[1].BeginAccept(new AsyncCallback(OnClientConnect2), m_mainSocket[1]); 
         Log.updateErrorlog(localip[i].ToString()+" Port : "+port); 
        } 
        catch 
        { } 
       } 

public void OnClientConnect2(IAsyncResult ar) 
     { 

      Socket listener2 = (Socket)ar.AsyncState; 
      try 
      { 

       NewConnection2(listener2.EndAccept(ar)); 
       listener2.BeginAccept(new AsyncCallback(OnClientConnect2), listener2); 
      } 
      catch 
      { 

       listener2.Close(); 

      } 
     } 
     public void NewConnection2(Socket sockClient) 
     { 
      SocketChatClient client2 = new SocketChatClient(sockClient); 
      //m_aryClients.Add(client2); 
      client2.SetupRecieveCallback2(this); 
      if (!InvokeRequired) 
      { 

      } 
      else 
      { 

      } 
     } 

     public void WaitForData(System.Net.Sockets.Socket soc) 
     { 

      SocketChatClient client2 = new SocketChatClient(soc); 
      client2.SetupRecieveCallback2(this); 

     } 

     public void OnDataReceived(IAsyncResult ar) 
     { 

      SocketChatClient client = (SocketChatClient)ar.AsyncState; 
      byte[] aryRet = client.GetRecievedData(ar); 
      string mdz3 = ""; 
      mdz3 = System.Text.Encoding.ASCII.GetString(aryRet, 0, aryRet.Length); 

      if (aryRet.Length < 1) 
      { 
       client.Sock.Close(); 

       return; 
      } 

      messageReceived msend = new messageReceived(mdz3, aryRet, client.Sock); 
      msend.msg_thread.Start(); 

      msend.msg_thread.Join(); 

      client.SetupRecieveCallback2(this); 


     } 

而且,下面是我的messageReceived .cs类。

public Thread s_thread; 
     private string RecvData; 
     private Random RNo = new Random(); 
     private Socket ClientSocket; 

     public MsgThread(byte[] aryRecvData,Socket _ClientSocket) 
     { 
      RecvData = System.Text.Encoding.ASCII.GetString(aryRecvData,0,aryRecvData.Length); 
      ClientSocket = _ClientSocket; 
      s_thread = new Thread(new ThreadStart(ProcessThread)); 
     } 

private void MsgThreadProcess() 
     { 
      lock (this) 
      { 
string[] msg = RecvData.Split('|'); 
Process(msg); 
      } 
     } 

当我接收第一插座消息,我想等待另一个5秒第二插座消息和处理两个消息。如果我在5秒内没有收到任何东西,我会继续处理第一个。请指教。谢谢。

回答

1

为什么不让消息处理线程始终运行?您可以将消息发布给它,让它处理额外的处理逻辑,例如等待另一个5秒以获得第二条消息。类似的规定:

public class MessageProcessor 
{ 
    private Thread _ProcessingThread; 
    private Queue<Message> _MessageQueue; 
    private AutoResetEvent _MessagePosted; 

    public MessageProcessor() 
    { 
     _MessagePosted = new AutoResetEvent(false); 
     _MessageQueue = new Queue<Message>(); 
     _ProcessingThread = new Thread(ProcessMessages); 
     _ProcessingThread.Start(); 
    } 

    public void Post(Message msg) 
    { 
     _MessageQueue.Enqueue(msg); 
     _MessagePosted.Set(); 
    } 

    private void ProcessMessages(object state) 
    { 
     while (!_Quit) 
     { 
      _MessagePosted.WaitOne(); 
      _MessagePosted.WaitOne(TimeSpan.FromSeconds(5)); 
      ... process message queue 
     } 
    } 
} 

而在你的消息接收代码,你做

messageProcessor.Post(receivedMessage); 

你需要把一些锁定以保护您的队列等(虽然.NET 4,你有ConcurrentQueue<T>)。您还可以在消息处理线程上使用BeginInvoke来处理异步处理。