Плохо полученные данные C# - PullRequest
0 голосов
/ 19 января 2020

почему я получил это: получил строку , когда я отправляю это? отправил строку

Код клиентского приложения:

try
        {

            tcpclient.Connect("127.0.0.1", 80);

            String str = "LOG" + Login.Text + "$" + hasło.Text;
            Stream stm = tcpclient.GetStream();
            ASCIIEncoding asen = new ASCIIEncoding();
            byte[] buffer = asen.GetBytes(str);
            stm.Write(buffer, 0, buffer.Length);

Код хоста:

  try
        {
            string msg = "";
            Socket socket = Listerner.AcceptSocket();
            ASCIIEncoding asen = new ASCIIEncoding();

            int x = socket.ReceiveBufferSize;
            byte[] buffor = new byte[x];
            int data = socket.Receive(buffor);
            string wiadomość = Encoding.ASCII.GetString(buffor);

1 Ответ

0 голосов
/ 19 января 2020

Это потому, что ваша переменная buffor на хосте имеет фиксированный размер и, таким образом, Encoding.ASCII.GetString будет пытаться преобразовать полный байтовый массив обратно в строку, независимо от того, сколько байтов было фактически получено.

socket.Receive возвращает количество байтов, которые были фактически получены. Используйте эту информацию для восстановления строки:

int bytesReceived = socket.Receive(buffor);
string wiadomość = Encoding.ASCII.GetString(buffor, 0, bytesReceived);

См. Encoding.ASCII.GetString и Socket.Receive для справки.

Теперь это должно работать для вашего крошечного примера. Но имейте в виду, что вы можете получить больше байтов, чем может занять ваш буфер одновременно. Таким образом, вы должны сделать что-то вроде:

string messageReceived = "";
int bytesReceived = 0;
do
{
    bytesReceived = socket.Receive(buffor)
    messageReceived += Encoding.ASCII.GetString(buffor, 0, bytesReceived);
} while(bytesReceived >= buffor.Length)
// now messageReceived should contain the whole text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...