2011-02-06 102 views
1

我在我的應用程序中實現主/從體系結構。.Net套接字客戶端數據接收問題

Master從數據庫輪詢作業,然後在作業中分配作業。我使用套接字連接來維護主從機之間的連接並將作業發送到客戶機。

只要主服務器啓動進程,一個線程開始創建作業隊列,另一個線程開始從隊列中獲取作業,並逐個將其連接到所有連接的從服務器。從機完成作業後,它會向主機發送一些確認信息,表明它是空閒的,並且再次將主機作業提供給該客戶機。如果隊列爲空,則主服務器向客戶端發送一些確認,之後客戶端再次向主服務器發送一些確認,主服務器再次檢查隊列併發送作業(如果可用)。這個過程一直持續下去,直到主人決定完成所有的工作。

確認只是一些不變的價值。無論何時客戶端收到此常量值,客戶端都會將相同的值發送回主服務器,並且如果主服務器接收到此常量值,則會發送作業(如果隊列中可用),否則將相同的值發送回客戶端。這樣,主人和奴隸繼續溝通,直到工作完成。

我正在使用異步套接字的c#windows服務器。

我的問題是在處理客戶端收到的數據時,有時客戶端正在獲取重疊值。這是發生在客戶端套接字的下列事件:

public void OnDataReceived(IAsyncResult asyn) 

    { 

     SocketPacket theSockId = null; 

     try 

     { 

      theSockId = (SocketPacket)asyn.AsyncState; 

      int iRx = theSockId.currentSocket.EndReceive(asyn); 

      char[] chars = new char[iRx + 1]; 

      System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder(); 

      int charLen = d.GetChars(theSockId.dataBuffer, 0, iRx, chars, 0); 

      System.String szData = new System.String(chars); 

      if (OnDataRecievedFromMaster != null) 

      { 

       OnDataRecievedFromMaster(Convert.ToInt32(szData), theSockId.hostName); 

      } 

      //richTextRxMessage.Text = richTextRxMessage.Text + szData; 

      WaitForData(theSockId.hostName); 

     } 

     catch (ObjectDisposedException) 

     { 

      System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n"); 

     } 

     catch (SocketException se) 

     { 

      if (se.ErrorCode == 10054) // Error code for Connection reset by peer 

      { 

       //string msg = "Client " + socketData.hostName + " Disconnected" + "\n"; 

       //AppendToRichEditControl(msg); 

       // Remove the reference to the worker socket of the closed client 

       // so that this object will get garbage collected 

      } 

     } 

     finally 

     { 





     } 

    } 

在這種情況下,szdata的價值是不是真正的高手發出的原始值。大多數時候價值重複。我只發送整數值到客戶端或服務器,沒有字符串。

爲什麼我得到這個任何種類的輸入將真正讚賞。

+0

你的字符串處理是比較奇怪的(和馬車:緩衝區太小,你就不能使用Encoding.GetString?)。此外,您似乎認爲讀取會返回完整的「消息」。 TCP沒有消息。 Read可以返回比發送的字節數少的字節。另外,你爲什麼將整數作爲字符串發送?只需將它們發送爲固定長度的4字節消息即可。 – usr 2013-12-28 15:44:26

回答

0

你是如何安排兩個線程 - 主從,如果你讓他們倆沒有任何同步運行有可能是一個問題。假設從機繼續檢查數據而沒有主機給出數據,那麼在這種情況下,客戶端可能會得到多個重複值。事實上,你只是有時得到這個錯誤,並不總是指向併發錯誤。

+2

主人不會將作業提交給同一個從屬人員,除非它獲得來自從屬人員的確認,它現在可以自由處理作業。我認爲這樣我就可以同步主人和奴隸。如果我缺少某些東西,我可以重新檢查我的代碼。感謝您的意見,非常感謝。 – Bikswan 2011-02-06 05:42:38

相關問題