2014-01-07 24 views
0

緩衝在客戶端我使用額外的線程,其執行這種方法:獲得相同的數據從TCP/IP服務器

public void FillBuf(object sender) 
{ 
var handler = (Socket)sender; 

while (true) 
{ 
    received = 0; 

    while (received < 512) 
    { 
    int block = handler.Receive(bytes, received, bytes.Length - received, SocketFlags.None); 
    received += block; 
    } 

    que.Enqueue(bytes); 

} 
} 

在服務器上我也有在我發送這樣的數據附加線程:

while(true) 
{ 
for (int i=0; i < handler.Length; i++) 
{ 
if (handler[i] != null) 
{ 

    bytes = BitConverter.GetBytes(move);//move 
    Array.Resize<byte>(ref bytes, 512); 
    handler[i].Send(bytes); 

    bytes = Transmition.SerializationCardArr(game.player[i].GetPlayerPack);//playerCards 
    Array.Resize<byte>(ref bytes, 512); 
    handler[i].Send(bytes); 

    bytes = Transmition.SerializationCardArr(table.GetAttackCards);//attackCards 
    Array.Resize<byte>(ref bytes, 512); 
    handler[i].Send(bytes); 

    bytes = Transmition.SerializationCardArr(table.GetDefendCards);//defendCards 
    Array.Resize<byte>(ref bytes, 512); 
    handler[i].Send(bytes); 

} 
} 
} 

當隊列中的元素數量達到一定數量時,我從緩衝區中提取數據。

問題是緩衝區中的所有元素都是相同的。 謝謝。

回答

2

在您的客戶端代碼中,您將重複使用相同的字節數組,然後將參考排入其中。您需要爲每個緩衝區創建一個新的字節數組:

public void FillBuf(object sender) 
{ 
    var handler = (Socket)sender; 

    while (true) 
    { 
     // Note: use local variables here. You really don't want these variables 
     // getting mixed up between threads etc. 
     int received = 0; 
     byte[] bytes = new byte[512]; 

     while (received < bytes.Length) 
     { 
      int block = handler.Receive(bytes, received, bytes.Length - received, 
             SocketFlags.None); 
      received += block; 
     } 
     que.Enqueue(bytes); 
    } 
} 
+0

O my!我認爲它排隊工程不同。我用了很多時間來處理這個錯誤。非常感謝! – user3149474

+0

但無論如何它看起來像數據重複。例如,當我發送'2'時,出於某種原因我收到'2'和'2'。 – user3149474

+0

即使不重複。它發送完全一團糟。 – user3149474