2011-04-19 205 views
0

我正在为我的一个学校项目做这个。我试图设计一个多线程服务器,接受客户端使用数据库(添加,删除记录等)。当我将客户端连接到服务器时,我想要接收数据库中的所有学生。如何通过tcp/ip协议发送一个包的长度

我访问服务器端的数据库,并将信息存储在ArrayList中,我试图通过网络发送它。我对XMLserializing没有任何知识,所以我试图将arrayList中的每个字符串发送到客户端。当我从服务器发送数据时,我有时会同时收到所有数据,有时候我不会,所以我的第一个猜测是我必须将我发送的数据分成一些长度的包。我不知道如何在包的开头添加长度。难道它不是一回事吗?也许我得到正确的长度,也许我没有。

这是我的代码;我没有尝试发送每个包的长度,因为我不知道如何。我尝试从服务器发送arraylist的长度,并从网络流中多次读取,但它不起作用(我在一个包中接收所有数据)。

服务器端:

private void HandleClient(object client) 
    { 
     try 
     { 
      ClientNo++; 

      TcpClient tcpClient = (TcpClient)client; 
      NetworkStream clientStream = tcpClient.GetStream(); 
      byte[] bytes = new byte[4096]; 
      int i; 
      // Robot r = new Robot(); 
      Protocol p = new Protocol(); 
      ArrayList ListaStudentiResponse = p.ExecuteQueryOnStudents("select * from studenti"); 
      byte[] Length = new byte[4]; 
      Length = System.Text.Encoding.ASCII.GetBytes(ListaStudentiResponse.Count.ToString()); 
      clientStream.Write(Length, 0, Length.Length); 
      foreach (String s in ListaStudentiResponse) 
      { 

       byte[] data = System.Text.Encoding.ASCII.GetBytes(s); 
       clientStream.Write(data, 0, data.Length); 

      } 


      tcpClient.Close(); 
      ClientNo--; 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

    } 

客户端:

private void connectToServerToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     tcpclient = new TcpClient(); 

     NetworkStream netStream; 
     try 
     { 
      tcpclient.Connect("localhost", 8181); 
      netStream = tcpclient.GetStream(); 
      Byte[] bytes = new Byte[10000]; 
      int readBytes = netStream.Read(bytes, 0, bytes.Length); 
      int Length =Int32.Parse(Encoding.ASCII.GetString(bytes, 0, readBytes)); 
      MessageBox.Show(Length.ToString()); 
      int i = 0; 
      while (i < Length) 
      { 
       i++; 
       Byte[] b = new Byte[10000]; 
       readBytes = netStream.Read(bytes, 0, bytes.Length); 
       String response = Encoding.ASCII.GetString(b, 0, readBytes); 
       MessageBox.Show(response); 


      } 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

    } 
} 
+0

您应该匹配客户端上的缓冲区长度。即分别使用长度为4字节和10,000字节的缓冲区并记录。 – Smudge202 2011-04-19 23:20:07

回答

0

这是我一直在使用它:

How to use the buffer on SocketAsyncEventArgs object

看接受的答案。第一次,这是使用一个比异步高效的呼叫完成端口。其次,我发现通过查看e.SocketError来发现故障的确切原因,很容易排除故障。

它的工作原理是为了让您的消息发送,附加带有标题和预告片的消息。
所以当它收到消息时,它会检查是否收到预告片。如果未收到预告片,它将继续接收该客户端,并将收到的消息附加到stringBuilder对象。收到预告片后,只需调用stringbuilder.toString()即可获取整个内容。

相关问题