Phix1964 Ответов: 1

Tcpclient не ждет поступления данных перед завершением работы


Ладно, значит, я не эксперт и даже близко к этому не подхожу. Я пишу на VB как хобби и написал множество небольших приложений, и большинство из них предназначены для старых последовательных подключений устройств.
Теперь эти устройства подключаются через TCP. Просто, мне так показалось...
Мой сервер представляет собой встроенный SBC и очень структурирован в своем коммуникационном протоколе. Все данные заканчиваются фиксированным символом ETX (ChrW(3)). Таким образом, я должен быть в состоянии получить входящий поток ответов и сохранить его в строку до тех пор, пока не прибудет ETX.
Это также является одним нажатием кнопки, подключения-передача-получать суб.
Наличие отдельной кнопки подключения/отключения было бы полезно, Так как иногда посылается несколько команд, а многократное подключение/отключение кажется смешным.
Любая помощь была бы очень кстати.
Кевин


Shared Sub Connect(server As [String], port as [Int32], message As [String])
   Try
      Dim client As New TcpClient(server, port)
      Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(message)
      Dim stream As NetworkStream = client.GetStream()

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

      RTB1_update("Sent: {0}", message)

      data = New [Byte](256) {}

      Dim responseData As [String] = [String].Empty

      Threading.thread.sleep(2000)

      Dim bytes As Int32 = stream.Read(data, 0, data.Length)
      responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
      RTB1_update("Received: {0}", responseData)

      stream.Close()
      client.Close()
   Catch e As ArgumentNullException
      RTB1_update("ArgumentNullException: {0}", e)
   Catch e As SocketException
      RTB1_update("SocketException: {0}", e)
   End Try

End Sub


Что я уже пробовал:

Независимо от того, что я делаю, он не может этого сделать, и ожидание тайм-аута около 90 секунд-это шутка. Приведенный ниже код прямо из MSDN и завершается задолго до того, как данные даже поступают. Добавление thread.sleep на секунду или две помогает, Но некоторые данные длинные и обрезаются, некоторые очень короткие, и долгое ненужное ожидание глупо,

1 Ответов

Рейтинг:
11

Richard MacCutchan

Вы делаете неверное предположение в своем коде. Видеть Сетевой поток.Метод Чтения (Byte[], Int32, Int32) (System.Net.Sockets)[^], где он объясняет, сколько (если таковые имеются) данных возвращается по команде read. Не думайте, что вы получите все данные по одному вызову чтения. TCP/IP-это не то же самое, что чтение файла, поскольку вы можете читать только то, что было отправлено по сети, что может быть ничем.


CPallini

5.