比较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。我该怎么解决这个问题?

比较NetworkStream发送到服务器/从服务器发送的值

正如您在上一个问题中所问的,您没有跟踪收到的字节数。现在的情况是:

  • 在客户端上,您发送字符串"kamote"
  • 在服务器上,它将该字符串接收到一个10025字节长的缓冲区中
  • 然后,服务器将整个缓冲区发送回客户端——全部为10025个字节
  • 客户端接收这10025个字节的全部或部分,并将它们转换为字符串

转换后的字符串实际上是"kamote",后面有一堆0

必须使用Read的返回值来知道收到了多少字节。

您是否尝试将字符串长度限制为实际读取的字节,如下所示:

noOfBytes = ns.Read(bytes, 0, ...);
Encoding.ASCII.GetString(bytes, 0, noOfBytes);

由于在getstring中包含了整个fromServer,因此包含了大量0个字符。0s不打印,但它们在那里。您必须告诉它要解码的正确字节数。