сравнение значений, отправленных на/с сервера NetworkStream

Когда вы знаете, почему строка «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. Как я могу это исправить?


person Vincent Dagpin    schedule 02.06.2011    source источник


Ответы (3)


Как и в предыдущем вопросе, который вы задали, вы не отслеживаете количество полученных байтов. Итак, что происходит:

  • На клиенте вы отправляете строку «kamote».
  • На сервере он получает эту строку в буфер длиной 10025 байт.
  • Затем сервер отправляет весь буфер обратно клиенту — все 10025 байт.
  • Клиент получает все или часть этих 10025 байт и преобразует их в строку.

Строка, которая преобразуется, на самом деле является "kamote" с кучей нулей после нее.

Вы должны использовать возвращаемое значение от Read, чтобы узнать, сколько байтов вы получили.

person Jim Mischel    schedule 02.06.2011
comment
вот .. я понял .. я использую этот return Encoding.ASCII.GetString(fromServer).Substring(0,str.Length).Equals(str); чтобы прекратить лишнее .. в любом случае, как узнать, какова длина байтов для этой строки kamote ? - person Vincent Dagpin; 02.06.2011

Вы пытались ограничить длину строки фактическими байтами чтения следующим образом:

noOfBytes = ns.Read(bytes, 0, ...);
Encoding.ASCII.GetString(bytes, 0, noOfBytes);
person Howard    schedule 02.06.2011

Вы включаете много символов 0, так как вы включаете весь fromServer в getstring. 0 не печатаются, но они есть. Вы должны сообщить ему правильное количество байтов для декодирования.

person Marc Gravell    schedule 02.06.2011