2013-08-02 101 views
0

您好所有我有這個問題,我堅持了下來,所以任何幫助,將不勝感激套接字隊列問題

我必須建立一個socket聊天(客戶端服務器)模塊,我已經做了近80%工作,但現在我卡住了,情景是我有一個服務器應用程序和客戶端連接到它現在如果說4個客戶端連接到服務器,他們每個人都可以互相溝通,一個客戶端將發送消息,服務器將收到該消息並將傳遞它,這是工作得很好,但當2個或更多的客戶端發送消息到第三個客戶端在同一時間,我不能得到一個消息和客戶端斷開連接我知道我必須建立一個隊列結構,但我在這裏沒有成功 這裏是我的代碼結構

StartReceive(SocketAsyncEventArgs) -> 

所有我把這種方法首先開始監聽傳入的消息

,當我得到一個消息,我檢查它是否完成同步或異步

,並在此之後有一個IO每完成一個接收操作就完成一個完成的監聽器,並且在這個完成的方法中,我會調用processReceive方法來處理接收到的塊 因此最後我的代碼結構是這樣的

StartReceive-> IO Completed -> ProcessReceive 

我設計的結構,使每一個客戶都會有一個接收SOCKETASYNCEVENTAGRS 對象,並在服務器端發送SOCKETASYNCEVENTAGRS而我呢維持這個

所以每個客戶端接收,並通過自身的SOCKETASYNCEVENTAGRS對象發送數據池

我想要一個場景,如果兩個或多個客戶端發送消息到第三個客戶端比第三個客戶端不應該在同一時間接收所有消息,而應該有一個隊列結構,它應該一次接收一條消息用於發送操作

這裏是我的一些代碼

private void StartReceive(SocketAsyncEventArgs receiveSendEventArgs) 
    { 
     DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)receiveSendEventArgs.UserToken; 
     receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetReceive, this.socketListenerSettings.BufferSize);      
     bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.ReceiveAsync(receiveSendEventArgs); 
     if (!willRaiseEvent) 
     { 

      ProcessReceive(receiveSendEventArgs);     
     }    
    } 

這是IO完成

void IO_Completed(object sender, SocketAsyncEventArgs e) 
    { 
     DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)e.UserToken; 
     switch (e.LastOperation) 
     { 
      case SocketAsyncOperation.Receive:     
       ProcessReceive(e); 
       break; 

      default: 
     } 
    } 

,這是我StartReceive與隊列實現,但它不工作

Queue rec = new Queue(); 
    bool IsExecuted = true; 
    private void StartReceive(SocketAsyncEventArgs receiveSendEventArgs) 
    { 
     if (IsExecuted) 
     { 
      DataHoldingUserToken receiveSendToken = (DataHoldingUserToken)receiveSendEventArgs.UserToken; 
      rec.Enqueue(receiveSendToken); 
     } 
     try 
     { 
      receiveSendEventArgs.SetBuffer(receiveSendToken.bufferOffsetReceive, this.socketListenerSettings.BufferSize); 
      bool willRaiseEvent = receiveSendEventArgs.AcceptSocket.ReceiveAsync(receiveSendEventArgs); 
      if (!willRaiseEvent) 
      { 

       ProcessReceive(receiveSendEventArgs); 
      } 
      rec.Dequeue(); 
      IsExecuted = true; 
     } 
     catch 
     { 
      IsExecuted = false; 
      StartReceive(receiveSendEventArgs); 
     } 
    } 

尋找一個體面的幫助或一些好的方向

+0

有幫助嗎?我想要它:( –

+0

)如果我把這件事情做對了,你將有關SAEA對象的信息作爲一個UserToken傳遞給同一個對象,你爲什麼要那樣做? 而且有一件事情是跳到我身上的就是你使用System.Collections.Queue類而不是推薦的System.Collections.Generic.Queue 類。如果其他人正在工作,也許切換到泛型類將會有所幫助。 – HaMster

回答

1

我不確定這是否是問題的根源,但它似乎對我來說,您在某個時間用完DataHoldingUserToken是因爲您從未對您出列的物品做過任何處理,因此您將其扔掉。

另請注意,建議使用非平凡對象的Queue類的通用形式。那將是System.Collections.Generic.Queue<DataHoldingUserToken>

+0

感謝HAmster爲您的寶貴時間我正在等待答案,並意味着,當我重新讀取我的整個代碼,我發現問題,真正的問題是與過程接收方法,我正在處理其他東西在過程接收部分,但它被搞亂了,所以我從進程接收中刪除隊列,現在它在某種程度上工作,並且你說我只是在出隊後拋出對象,以及我在處理這些對象時接收並非常感謝你。建議通用隊列的我想知道我沒有使用這個,我現在會去用它:) –