Отправка данных на сервер с помощью NetworkStream - PullRequest
0 голосов
/ 09 июня 2019

Мое назначение - сделать клиента, который отправляет метод ToString-override на сервер. Мой учитель прислал мне файл Centralcomputer.exe, который является программой сервера, эта программа может получать отдельные строки и использует мой локальный IP-адрес.

Я подключаюсь без проблем, проблема возникает при попытке выполнить эту строку Int32 bytesRead = stream.Read(bytesToRead, 0, klient.ReceiveBufferSize); мой клиент зависает, и значение bytesRead равно 0.

РЕДАКТИРОВАТЬ: Забыл упомянуть, что серверная программа отвечает некоторыми "восточными" письмами до того, как клиент зависает.

 TcpClient client = new TcpClient();

 public async Task Connecting()
    {
        try
        {

            await client.ConnectAsync("127.0.0.1", 12345);

        }
        catch (ArgumentNullException e)
        {
            MessageBox.Show("ArgumentNullException: {0}" + e);
        }
        catch (SocketException e)
        {
            MessageBox.Show("SocketException: {0}" + e);
        }


  public void Sending()
    {
        string sendToServer = "Testing testing";
        byte[] data = System.Text.Encoding.ASCII.GetBytes(sendToServer);

        NetworkStream stream = client.GetStream();

        stream.Write(data, 0, data.Length);

        byte[] bytesToRead = new byte[client.ReceiveBufferSize];

        Int32 bytesRead = stream.Read(bytesToRead, 0, client.ReceiveBufferSize);    
        //This is where the client freezes

        MessageBox.Show("Received : " + Encoding.ASCII.GetString(bytesToRead, 0, bytesRead));
    }

Раньше я никогда не занимался этим типом кодирования, поэтому я очень признателен за помощь, только чтобы начать!

Ответы [ 2 ]

0 голосов
/ 09 июня 2019

Возможно, ваш сервер ожидает возврата каретки или / и перевода строки перед записью чего-либо клиенту.

Попробуйте изменить следующую строку

string sendToServer = "Testing testing";

на

string sendToServer = "Testing testing \r\n";

Поскольку у нас нет доступа к коду сервера, довольно сложно дать вам точное решение.

0 голосов
/ 09 июня 2019

Здесь есть только два сценария, когда вы получите ноль:

  • чтение нулевой длины с буфером нулевой длины может использоваться для обнаружения, когда данные становятся доступными
  • входящий сокет закрыт

Предполагая, что вы не запрашивали чтение нулевой длины, мы можем принять второй вариант и сокет закрыт. Итак: почему он закрылся? Скорее всего, потому что сервер перестал ждать сообщения для ответа. Что говорит о том, что он не думает, что вы отправили полное сообщение.

Это, в свою очередь, означает одно из:

  • то, что вы отправили, не было выполнено согласно определению протокола, как ожидалось сервером
  • данные по-прежнему буферизированы и не отправлены

Чтобы исключить второе, обязательно наберите Flush() после Write. Если это по-прежнему не помогает, проверьте протокол очень внимательно, чтобы увидеть, что вы хотели отправить . Возможно, вы пропустили завершающий перевод строки или подобное.

В качестве примечания: всякий раз, когда вы делаете один Read в сокете, вы, вероятно, допустили ошибку. TCP не ориентирован на сообщения - это просто поток. Это означает, что вам всегда нужен цикл чтения, который обрабатывает любой используемый протокол кадрирования.

...