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

#c# #sockets #encoding #network-programming #tcpclient

#c# #сокеты #кодирование #сетевое программирование #tcpclient

Вопрос:

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

Ответ №1:

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

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

Преобразуемая строка на самом деле является «kamote» с кучей нулей после нее.

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

Комментарии:

1. вот .. я понял .. я использую эту кодировку возврата. ASCII. Получить строку (с сервера). Подстрока(0,str. Длина). Равно (str); для завершения дополнительного .. в любом случае, как узнать, какова длина байтов для этой строки «kamote»?

Ответ №2:

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

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

Ответ №3:

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