比较NetworkStream发送到服务器/从服务器发送的值
本文关键字:服务器 NetworkStream 比较 | 更新日期: 2023-09-27 17:58:20
当你知道为什么发送到服务器的字符串"kamote"和从服务器接收的字符串"kamote"不相同时。。
客户
tcpClient = new TcpClient();
tcpClient.Connect(ServerIP, Port);
connectionState = (HandShake("kamote", tcpClient)) ? "Connected to " + ServerIP.ToString() : "Host unreachable.";
private bool HandShake(String str, TcpClient tcpClient)
{
using (NetworkStream ns = tcpClient.GetStream())
{
byte[] toServer = Encoding.ASCII.GetBytes(str);
ns.Write(toServer,0,toServer.Length);
ns.Flush();
byte[] fromServer = new byte[10025];
ns.Read(fromServer, 0, (int)tcpClient.ReceiveBufferSize);
return Encoding.ASCII.GetString(fromServer).Equals(str);
}
}
服务器
TcpClient tcpClient = new TcpClient();
tcpClient = tcpListener.AcceptTcpClient();
NetworkStream ns = tcpClient.GetStream();
byte[] fromClient = new byte[10025];
ns.Read(fromClient, 0, (int)tcpClient.ReceiveBufferSize);
byte[] toClient = fromClient;
ns.Write(toClient, 0, toClient.Length);
ns.Flush();
客户端发送了"kamote"
服务器收到"kamote"
服务器发送了"kamote"
客户收到"kamote"
HandShake()
总是返回false。我该怎么解决这个问题?
正如您在上一个问题中所问的,您没有跟踪收到的字节数。现在的情况是:
- 在客户端上,您发送字符串"kamote"
- 在服务器上,它将该字符串接收到一个10025字节长的缓冲区中
- 然后,服务器将整个缓冲区发送回客户端——全部为10025个字节
- 客户端接收这10025个字节的全部或部分,并将它们转换为字符串
转换后的字符串实际上是"kamote",后面有一堆0
必须使用Read
的返回值来知道收到了多少字节。
您是否尝试将字符串长度限制为实际读取的字节,如下所示:
noOfBytes = ns.Read(bytes, 0, ...);
Encoding.ASCII.GetString(bytes, 0, noOfBytes);
由于在getstring中包含了整个fromServer
,因此包含了大量0个字符。0s不打印,但它们在那里。您必须告诉它要解码的正确字节数。