我正在使用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
答案 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));
}
或任何等同物。