Hy家伙,这就是我的客户端和服务器代码的样子:
客户:
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();
我正在尝试将用户名和密码作为字符串从客户端发送到服务器,但问题是我在服务器端收到两个字符串,存储在"message"中.我知道不知怎的,我应该认识到第一个字符串的结束并放入第一个数组,然后从那里开始并将另一个放入第二个数组,但我不知道该怎么做.我想问你是否可以帮我解决这个问题.
问题是您正在使用基于流的协议(TCP/IP),就好像它是基于消息的协议一样.不是.这里有几个选项,但最简单的是:
在每条消息后写一个分隔符
在每条消息之前写一个长度前缀(消息中的字节数)
后者是我通常喜欢的 - 它意味着你在开始阅读之前总是知道你需要读取多少数据,这意味着你可以告诉你什么时候完成,你知道在你之前分配的数组大小也开始阅读.哦,这也意味着没有必要逃避任何事情,而如果你有一个可能在消息中自然出现的分隔符,则需要转义.