在套接字上接收数据的最有效方法

时间:2016-10-03 18:42:59

标签: vb.net sockets tcp tcpclient

我写了一个VB.Net应用程序,它连接到一个输出稳定消息流的远程IP /端口组合。 IP地址可以是localhost,也可以是远程计算机。

远程进程可以随时停止和启动,我的进程需要连接到它并开始接收。两者之间没有就使用哪些端口进行协商。

我当前的代码使用TcpClient和NetworkStream一次读取一个字节。这将转换为相应的ASCII字符(所有消息都是ASCII文本)并附加到字符串,直到收到EOL字符。一旦它被添加到要处理的队列中,该字符串将被截断并且该过程再次开始。虽然这有效,但一次听一个字节可能不是最有效的方法。

我现在正在测试应用程序,但我遇到了一些严重的性能问题。虽然我当前的代码工作,它无法处理抛出的数据量。虽然它每秒可以处理500条消息,但它确实以每秒1500的速度挣扎,并且峰值为20%CPU。

我确信瓶颈是一次读取一个字节的数据 - 有没有办法加快速度?理想情况下,我喜欢一次读取一行数据,直到收到EOL字符,但TcpClient中似乎不存在此功能。

套接字编程不是我的强项,所以也许我错过了一些明显的东西。帮助!

2 个答案:

答案 0 :(得分:0)

Bytewise IO通常在教程中显示,因为它非常简单。它不适合生产。

编程套接字时,可以使用最高级别的抽象。理想情况下,您放弃原始套接字并通过HTTP或websockets等请求数据。可以使用图书馆。

如果您坚持使用原始套接字,可以尝试使用StreamReader/Writer的基于行的格式。不需要ASCII,只需使用默认的UTF8

可以与此类似地获得读者:new StreamReader(new NetworkStream(socket))

答案 1 :(得分:-2)

尝试使用System.Text命名空间中的ASCIIEncoding.GetString方法。它应该将字节数组转换为字符串,而不是一次接近一个字节。

Dim ascii As New ASCIIEncoding()
'*** define bytes() byte array here ***
Dim decoded As String = ascii.GetString(bytes)

此方法还有一个unicode变体。