返回首页

感谢这么多的回答。我需要重新我的问题......该设备作为TCP服务器功能在不断地发送数据,因为我不能修改任何TCP服务器参数是一个封闭的设备。我有接收和存储数据的地方可持续为了在此期间,我需要保持接收服务器数据处理,因为我不能失去任何部分服务器的消息。

然后,我有两件事要做:我必须接收和储存(例如数组)在同一时间,我需要读取接收到的数据进行处理,一个连续的数据流。服务器将永远不会停止发送数据,我要赶在发送的所有数据。

这是我问,如果有一个方式不取决于一个字节的缓冲区,TCP客户端,如果有一个可持续的方式获得的所有数据存储,数据不丢失任何数据流的一部分来接受她的原因。{ BR}
再次感谢!

-------------------------------------------------- --------

您好:

我在我的应用程序使用TCP客户端套接字。在这种情况下,我需要从设备(即作为TCP服务器工作),是可持续不指定发送的数据的长度,然后将它发送的邮件发送接收数据,它就像二进制数据流。我需要读取这些数据,并处理消息的某些特定的零件。最常见的引用,我发现接收的TCP数据流中读取的方法,但这种方法需要定义一个自定义大小的缓冲区。请阅读我的代码如下:


Imports System.IO

Imports System.Net.Sockets

Imports System.Threading

Imports System.Net

Imports System.Text

 

Public Class Write

    Public Event DataRecieved(ByVal data As String)

    Private Stm As Stream

    Private tcpThd As Thread

 



    Public Sub ConnectToServer()

        Try

            Dim tcpClnt As New TcpClient

            tcpClnt.Connect(IPAddress.Parse("192.168.1.50"), 2111)

            Stm = tcpClnt.GetStream()

            tcpThd = New Thread(AddressOf ReadSocket)

            tcpThd.Start()

        Catch ex As Exception

            MsgBox(ex.Message)

            Exit Sub

        End Try

 

    End Sub

 

#Region "Private Methods"

    Private Sub ReadSocket()

        Dim Buffer() As Byte

        While True

            <b>Buffer = New Byte(4000) {}</b>

            <b>Stm.Read(Buffer, 0, Buffer.Length)</b>

            DataRecieved(Encoding.ASCII.GetString(Buffer))

        End While

    End Sub

#End Region

End Class


你自己看着办,如果我定义了一个4000字节的缓冲区,我读设备发送的数据只有4000字节,但保持设备发送数据的时间,我需要保持数据读取所有的时间太多,不只是4000字节...有没有办法读取数据,所有的时间和处理这些数据,它收到的那一刻吗?

感谢在前进。

回答

评论会员:Jimmanuel 时间:2012/02/06
GT,GT;我有,以接收和存储这些数据的地方可持续,以便对其进行处理,在此期间,我需要继续接收服务器数据,因为我可以不失去的服务器上的邮件的任何部分。

套接字将数据缓冲为你,直到你读它,但如果缓冲区已满,它会开始下降的消息。您需要确保您保持经常阅读足以使插座没有放弃任何。换句话说,你需要保持在一个循环中读取(如你正在做的),而不是让处理数据,以阻止从套接字读取数据。我想你已经意识到这一点,基于这种说法:

GT,GT,如果有一个方式让所有的数据可持续存储它没有丢失任何数据流的一部分

为了解决这部分:

GT,GT,如果有一个方法,不依赖字节缓冲区

没有,套接字发送和接收字节。如果你要处理直接与插座然后字节[] S是你有什么处理。虽然,这不是你的代码的问题,这是处理同一线程读,看起来很危险的数据。根据多久需要数据可以备份等待被读取,这就是你想要避免。它可能是这种情况,服务器不发送数据频繁和/或解析它并不需要很长时间,在这种情况下,你会罚款。

如果不是这样或那样的情况,那么我认为你将不得不到另一个线程的数据处理。究竟如何做到这一点就取决于你的应用程序的具体细节。你可能不希望做的是开始为每个收到的消息,新的线程,而不是你最有可能想要一个线程来处理每封邮件。这将使如此,每个消息处理一次,和他们在他们收到的订单处理。如果这些事情无关紧要,那么你既可以每个消息(仍可能不是最佳)启动一个线程或使用线程池来为您处理的线程(可能是比手册线程更好)。

不管采用哪种方法,
{C}
循环将改变
while

{

    read;

    send data to another thread for processing;

}
这样做阅读的线程将不会花费任何时间在处理,并可以继续从套接字读取数据。还有一些其他的事情要考虑:
*从套接字读取的代码周围的异常处理 - 目前有没有
*线程如何做阅读和解析退出干净吗?的方式,读取线程写入是没有出路的。
*你如何从读线程处理线程的数据?你想读线程安全的,等待(如])把手和其他普通线程主题。或张贴另一个问题上,寻求帮助。
*每次读你给你一个完整的邮件解析,或您可能需要结合来自多个接收到的数据读取到一个完整的邮件?或将一个读给你多个消息解析一次?
*为什么是一类称为写读取数据
评论会员:?ShacharK 时间:2012/02/06
即使你使用亿字节的缓冲区,它并不重要。在一个收到你不会得到完全的整个缓冲区。如果你担心4000个字节是不足够为整个消息传递,你可以写一个4字节的数据包,将代表预期的缓冲区的大小和相应的申报(然后循环,直到你会得到整个缓冲区) 。您可能会发现它也是有用的跟踪缓冲区内的进展。你可以(而且必须)知道在每次迭代中读取的字节,读函数返回它的数量。