Как использовать .NET NetworkStream и TcpClient для подключения к удаленному IP-адресу и ожидания данных? - PullRequest
0 голосов
/ 14 октября 2011

Я много борюсь с этим кодом, который пытаюсь заставить работать. Я успешно установил соединение с объектом TcpClient на две отдельные удаленные машины и передал на них данные. По сути, я пытаюсь подключиться к компьютеру 1 через порт 80 и отправить запрос GET. После отправки запроса я хочу сохранить соединение, чтобы программное обеспечение на другой стороне могло отправлять мне данные, когда оно будет готово. Как сохранить соединение открытым и читать данные каждый раз, когда оно становится доступным в потоке? Я пытался и пытался использовать NetworkStream.Read и BeginRead безрезультатно. Самое близкое, что я пришел, - это спал мой поток каждые 30 секунд, а затем выполнял еще один запрос GET, который не нужен. Вот текущий код, который я имею для чтения из потока. Я знаю, что где-то здесь нужна петля:

Примечание: RemoteSocket - это мой объект TcpClient, который связан этой точкой

Dim serverStream As NetworkStream = RemoteSocket.GetStream()
rqst = "GET /Control/Clip_Forwarding_Stream?CameraName=" & URL_Encode(Name) & " HTTP/1.0" & vbCrLf & vbCrLf
Dim stream As Byte() = Encoding.GetEncoding("Windows-1252").GetBytes(rqst)
serverStream.Write(stream, 0, stream.Length)
Dim inStream(1024) As Byte
Dim recv = serverStream.Read(inStream, 0, inStream.Length)
Dim data = Encoding.GetEncoding("Windows-1252").GetString(inStream, 0, recv)

Что я делаю с данными, так это передаю их этому методу:

Примечание: ForwardSocket - это мой другой объект TcpClient, который связан этой точкой

Dim serverStream As NetworkStream = ForwardSocket.GetStream()
Dim stream As Byte() = Encoding.GetEncoding("Windows-1252").GetBytes(data)
serverStream.Write(stream, 0, stream.Length)

Любые примеры могут быть на C # или VB, так как мне больше всего нравится C #, просто нужно написать все это на VB.

Ответы [ 2 ]

0 голосов
/ 14 октября 2011

Вам нужно читать в цикле (аналогично ответу НоАлиаса).Но вы не должны просто зацикливаться, пока DataAvailable не станет ложным, потому что если ради аргумента у вас было 4K данных, то возникает небольшая пауза (перегрузка сети, что угодно), а затем еще 2K данных приходят, вы теряетеконец ваших данных, потому что DataAvailable был бы ложным в этой паузе.

Вместо этого вам нужно полагаться на протокол более высокого уровня, который в данном случае является HTTP.HTTP использует заголовок Content-Length, который точно скажет, сколько байтов будет присутствовать в теле.Вы должны выполнить цикл до тех пор, пока не получите это количество контента (или, конечно, не достигнете значения тайм-аута, если не хотите ждать вечно).

РЕДАКТИРОВАТЬ1

По фактучитая ваш вопрос еще раз, похоже, что вы, возможно, получаете данные, длина которых не известна.HTTP поддерживает отправку данных кусками, используя multipart .Ручное кодирование неинтересно, вы можете захотеть использовать классы HttpRequest и HttpResponse, чтобы справиться с этим самостоятельно.Он по-прежнему предоставляет вам поток с вашим контентом, но имеет дело с HTTP для вас.

0 голосов
/ 14 октября 2011
Do

   Dim inStream(1024) As Byte 
   Dim recv = serverStream.Read(inStream, 0, inStream.Length) 
   Dim data = Encoding.GetEncoding("Windows-1252").GetString(inStream, 0, recv)

Loop While serverStream.DataAvailable

Возможно, вас заинтересует метод BeginRead .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...