2011-10-14 27 views
0

我正在努力工作。我成功地将TcpClient对象连接到两个独立的远程机器并向它们传输数据。基本上,我试图连接到端口80上的机器1并发送GET请求。一旦我发送请求,我想保持连接处于活动状态,以便另一侧的软件可以在准备就绪时发送数据。如何保持连接处于打开状态并每次在流中提供数据时读取数据?我试过并尝试使用NetworkStream.Read和BeginRead无济于事。我来的最近的是每隔30秒睡一下我的线程,然后做另一个不需要的GET请求。这里是我从流中读取的当前代码。我知道我需要在这里的某个地方一个循环:如何使用.NET NetworkStream和TcpClient连接到远程IP并等待数据?

注: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是由这点

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#连接我其他的TcpClient对象只是不得不写这所有在VB中。

回答

0

你需要在一个循环内读取(类似于NoAlias的回答)。但是你不应该循环直到DataAvailable为false,因为如果为了争论你有4K的数据进来,然后有一个小的暂停(网络拥塞,不管),然后另一个2K的数据进来你会失去因为DataAvailable在该暂停中将是错误的。

相反,您需要依赖更高级别的协议,在本例中为HTTP。 HTTP使用一个名为Content-Length的头部,它会告诉你到底有多少字节会出现在主体中。您需要进行循环,直到您收到大量内容为止(或者当然已达到超时值,除非您想永远等待)。

EDIT1

在再次阅读您的问题,它看起来像你可获取一个没有已知的内容长度的数据。 HTTP支持使用multipart以块的形式发送数据。这对于手动代码来说并不好玩,您可能希望查看使用HttpRequest和HttpResponse类来处理这个问题。它仍然会为您提供一个包含内容的流,但会为您处理HTTP。

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

相关问题