我如何使用.net NetworkStream和TcpClient连接到远程IP并等待数据



我正在努力工作的代码很多。我已经成功地将TcpClient对象连接到两台独立的远程机器,并向它们传输数据。实际上,我尝试在端口80上连接到机器1并发送GET请求。一旦我发送请求,我希望保持连接,以便另一边的软件可以在准备好时向我发送数据。如何保持连接打开并在每次流中可用时读取数据?我试了又试使用NetworkStream。阅读和开始阅读都无济于事。我最接近的是每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中编写所有这些

您需要在循环中读取(类似于NoAlias的答案)。但是你不应该只是循环,直到DataAvailable为假,因为如果,为了争论,你有4K的数据进来,然后有一个小暂停(网络拥塞,无论什么),然后另一个2K的数据进来,你会失去你的数据的结束,因为DataAvailable在那个暂停中会为假。

相反,您需要依赖于更高级的协议,在本例中是HTTP。HTTP使用一个名为Content-Length的报头,它将告诉您正文中将包含多少字节。你需要循环,直到你收到了一定数量的内容(或者达到了一个超时值,当然,除非你想永远等待)。

EDIT1

再次阅读您的问题时,看起来您可能正在获取没有已知内容长度的数据。HTTP支持使用multipart以块方式发送数据。手工编码并不有趣,您可能想要使用HttpRequest和HttpResponse类来代替为您处理此问题。它仍然为您提供包含您的内容的流,但为您处理HTTP。

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方法感兴趣

最新更新