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

时间:2011-10-14 00:14:25

标签: .net vb.net tcpclient networkstream

我正在努力解决这个代码,我正努力开始工作。我已经成功地将TcpClient对象连接到两个独立的远程计算机并将数据传输给它们。基本上,我正在尝试在端口80上连接到机器1并发送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 :(得分:0)

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

答案 1 :(得分:0)

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

相反,您需要依赖更高级别的协议,在这种情况下是HTTP。 HTTP使用名为Content-Length的标头,它将告诉您正文中将存在多少字节。您需要循环直到收到该数量的内容(或者当然已达到超时值,除非您想要永远等待)。

<强> EDIT1

再次阅读您的问题后,您似乎可能正在获取没有已知内容长度的数据。 HTTP支持使用multipart以块的形式发送数据。手动编码并不好玩,您可能希望使用HttpRequest和HttpResponse类来代替处理此问题。它仍然可以为您提供包含内容的流,但会为您处理HTTP。