#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 не печатаются, но они есть. Вы должны указать ему правильное количество байтов для декодирования.