快速TCP接收

时间:2015-12-31 16:20:36

标签: vb.net tcpclient

我正在使用TCP客户端。但由于某种原因,接收数据的速度还不够快。如果服务器每50ms发送一个字符串(大约140个字符),它可以正常工作,但是我将它改为10ms(或更低),客户端不会显示每个字符串。 我尝试了另一个TCP聊天程序,有1毫秒没问题。 所以它应该是可能的; - )

在我的代码下面:

Imports System.Net, System.Text
Imports System.Net.Sockets
Imports System.IO
Imports System.Xml
Imports System.Globalization
Imports System.ComponentModel
Imports System.Management
Imports System.Text.RegularExpressions
Public Class Client
Dim t As New TcpClient
Private Sub Client_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Control.CheckForIllegalCrossThreadCalls = False
    Try
        t.Connect("127.0.0.1", "50020")
        If t.Connected Then
            t.GetStream.BeginRead(New Byte() {0}, 0, 0, AddressOf doread, Nothing)
            login()
            StatusStrip1.BackColor = Color.LightGreen
        End If
    Catch ex As Exception
        Application.Restart()
    End Try
End Sub
Sub login()
    senddata("LOGIN|")
End Sub
Sub doread(ByVal ar As IAsyncResult)
    Try
        If t.Connected = True Then
            Dim sr As New StreamReader(t.GetStream)
            Dim msg As String = sr.ReadLine()
            TextBox1.Text = (msg & vbCr & vbLf) & TextBox1.Text
            t.GetStream.BeginRead(New Byte() {0}, 0, 0, AddressOf doread, Nothing)
        End If
    Catch ex As Exception
        Application.Restart()
    End Try
End Sub
Sub senddata(ByVal message As String)
    Dim sw As New StreamWriter(t.GetStream) 'declare a new streamwriter
    sw.WriteLine(message) 'write the message
    sw.Flush()
End Sub
End Class

1 个答案:

答案 0 :(得分:1)

您可能不知道TCP连接表示字节流。消息/数据包不会被保留。您可能一次只收到一个字节。

您认为您正在接收整条线。

此外,二进制读取和StreamReader的这种混合使用不能用于多种原因。其中之一是StreamReader内部缓冲。每次创建一个新的时,都会抛出缓冲内容。

为什么要一直查看t.Connected?如果false,你什么都不做。这比没有检查更糟糕。不要盲目地从网上复制代码(我知道你复制了这个,因为这个破碎的模式遍布整个网络,没有人会想到这样做。)

Application.Restart

???这不是一个合适的错误策略。更好:处理所有资源并显示消息框。

这真的非常破碎。 Unsalvagable。需要改写。

只需在后台主题上执行此操作:

var sr = new StreamReader(...);
while (true) {
 var line = sr.ReadLine();
 if (line == null) break;
 Invoke(new Action(() => TextBox1.Text += line));
}

或任何等同物。