2013-09-26 32 views
1

夥計們,所以這裏是另一回事。多線程TCP

private void Form1_Load(object sender, EventArgs e) 
    { 
     sck.Connect("127.0.0.1", 8080); 
     int s = sck.Send(Encoding.Default.GetBytes("A" + "~" + "B" + "~" + "C" + "~" + "D")); 
    } 

有沒有辦法將它們分別發送到服務器?並接收它們並將它們分別添加到listView中而不會分裂? 下面的clientdata是無效負載形成整個整數

void client_Received(Client sender, byte[] data) 
    { 
     Invoke((MethodInvoker)delegate 
     { 
      for (int i = 0; i < listView1.Items.Count; i++) 
      { 
       Client client = listView1.Items[i].Tag as Client; 
       if (client.ID == sender.ID) 
       { 
        clientdata = Encoding.Default.GetString(data); ; 
        string[] str = clientdata.Split('~'); 
        listView1.Items[i].SubItems[2].Text = str[0]; 
        listView1.Items[i].SubItems[3].Text = str[1]; 
        listView1.Items[i].SubItems[4].Text = str[2]; 
        listView1.Items[i].SubItems[5].Text = str[3]; 
        break; 
       } 
      } 
     }); 
    } 

我想改變這一空白類似:

void client_Received(Client sender, byte[] A, byte[] B, byte[] C, byte[] D) 
{ 

} 
+0

這使用'NetworkStream'而不是原始套接字,但想法是一樣的。見http://blog.mischel.com/2013/09/24/reading-data-from-streams-part-3/ –

回答

3

你讓經典的錯誤的假設,一個插座Receive()如果正好你Send() 。這不是真的,這就是應用程序協議存在的原因。

將不得不決定分離參數和/或消息,這將是你的應用程序協議的方法。有很多種方法可以做到這一點,最簡單的方法是用一個整數表示以下消息的字節大小。

該協議必須被服務器和客戶端所理解,以使它們都能夠有效地進行通信。一旦你決定了你的消息格式,爲它創建一個解析器。然後,您可以讓解析器返回您喜歡的任何對象,例如包含您似乎願意發送的四個字節數組的對象。

+0

你能寫一個發送和接收的例子嗎? –

+0

網絡充滿了它,看例如http://stackoverflow.com/questions/11801666/proper-sending-and-receiving-via-c-sharp-sockets – CodeCaster