2014-04-21 72 views
0

海兰家伙,这是我的客户端和服务器代码的样子:发送两个字符串,但收到一个通过TCP

客户:

  TcpClient client = new TcpClient(); 
     client.Connect(IPAddress.Parse("192.168.1.12"), 5004); 
     NetworkStream stream = client.GetStream(); 

     string username = loginName_txt.Text; 
     byte[] message = Encoding.ASCII.GetBytes(username); 
     stream.Write(message, 0, message.Length); 
     loginName_txt.Clear(); 

     string password = password_txt.Text; 
     byte[] message1 = Encoding.ASCII.GetBytes(password); 
     stream.Write(message1, 0, message1.Length); 
     password_txt.Clear(); 

     stream.Close(); 
     client.Close(); 

服务器:

 TcpClient mClient = (TcpClient)client; 
     NetworkStream stream = mClient.GetStream(); 

     byte[] message = new byte[1024]; 
     int recv = stream.Read(message, 0, message.Length); 
     username = Encoding.ASCII.GetString(message, 0 , recv); 
     updateUI("Username: " + Encoding.ASCII.GetString(message, 0, recv)); 

     byte[] message1 = new byte[1024]; 
     int recv1 = stream.Read(message1, 0, message1.Length); 
     password = Encoding.ASCII.GetString(message1, 0, recv1); 
     updateUI("Password: " + Encoding.ASCII.GetString(message1, 0, recv1)); 

     stream.Close(); 
     mClient.Close(); 

我试图发送用户名和密码作为字符串从客户端到服务器,但问题是,我收到两个stri在服务器端作为一个存储在“消息”中。我知道,不知何故,我应该认识到第一个字符串的末尾,并放入第一个数组,然后从那里开始,并将另一个放入第二个数组中,但我不知道该怎么做。我想问你是否可以帮我解决这个问题。

回答

7

的问题是,您使用的是基于流的协议(TCP/IP),就好像它是一个基于消息协议。不是。有几个选择这里,但最简单的是:

  • 写的分隔符的每个消息
  • 后写长度前缀每个消息

之前(在消息中的字节数)后者是我通常喜欢的 - 这意味着您在开始阅读之前始终知道需要阅读多少数据,这意味着您可以告诉您何时完成,并且知道在您之前分配的数组大小也开始阅读。哦,这也意味着没有必要逃脱任何东西,而如果你有一个自然发生在消息中的分隔符,那就需要逃脱。

相关问题