2012-07-13 162 views
2

我創建了一個異步服務器,可以從任意數量的客戶端讀取消息。我的服務器代碼與此示例密切相關:http://msdn.microsoft.com/en-us/library/fx6588te.aspx定期將數據從服務器發送到客戶端

客戶端連接後,我想定期向該客戶端發送數據,可能每秒鐘發送2到3次。我想不出用異步send()實現這一點的好方法。我假設某種計時機制需要添加到我的AcceptCallback()方法中,因爲這是與客戶端的連接發生的地方。

在以前的版本我的服務器我用阻止套接字,只是我的環法send()在一個無限循環while()sleep()得到的時機了。

這裏就是我想:

public void AcceptCallback(IAsyncResult ar) 
    { 
     allDone.Set(); // Signal the main thread to continue. 

     // Get the socket that handles the client request. 
     Socket listener = (Socket)ar.AsyncState; 
     Socket handler = listener.EndAccept(ar); 
     IPEndPoint remotePoint = (IPEndPoint)handler.RemoteEndPoint; 
     IPAddress remoteAddress = remotePoint.Address; 
     Console.WriteLine("Connected to {0}!", remoteAddress.ToString()); 

     // Create the state object. 
     StateObject state = new StateObject(); 
     state.workSocket = handler; 

     //Start periodically sending here?? 

     handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
      new AsyncCallback(ReadCallback), state); 
    } 
+0

只需在'Timer'開始'BackgroundWorker'線程的工作即可。 – 2012-07-13 15:49:46

回答

1

我會成立一個Timer對象將數據發送到客戶端。在您的評論中實例化並啓動AcceptCallback方法中的計時器。您必須跟蹤信息以允許定時器回調將數據發送到客戶端(例如套接字以及某種測試以使其停止 - 儘管您可以簡單地關閉定時器,但是您可以在這種情況下必須跟蹤定時器)。

順便說一句,從來沒有在這樣的情況下調用睡眠,因爲它提交你的線程坐在一段時間,你不能輕易放棄它,讓線程回(退出或用於其他的東西)。

+0

我會試試這個。是的,我有一種感覺,睡覺()不是我想要使用的。 – 2012-07-13 16:36:42

相關問題