Vb.net TCP客户端到服务器通信
我要找的只是Windows窗体VB.Net上的一个简单的TCPClient/Listner示例。我是个新手,Microsoft TCPClient/Listner类示例不是我想要的。我所寻找的只是TCP客户端发送消息,以及TCP侦听器获取消息并返回消息“我收到了您的消息” 一点帮助就好了。我有一些代码,但只是将消息发送到服务器,而不是从服务器返回到客户端。。Vb.net TCP客户端到服务器通信,vb.net,winforms,tcp,client-server,tcpclient,Vb.net,Winforms,Tcp,Client Server,Tcpclient,我要找的只是Windows窗体VB.Net上的一个简单的TCPClient/Listner示例。我是个新手,Microsoft TCPClient/Listner类示例不是我想要的。我所寻找的只是TCP客户端发送消息,以及TCP侦听器获取消息并返回消息“我收到了您的消息” 一点帮助就好了。我有一些代码,但只是将消息发送到服务器,而不是从服务器返回到客户端。。 任何帮助都将不胜感激 TCP通信是基于流的,这意味着它不处理任何数据包。因此,您收到的消息可能是部分的,也可能是集中在一起的 例如,您可以
任何帮助都将不胜感激 TCP通信是基于流的,这意味着它不处理任何数据包。因此,您收到的消息可能是部分的,也可能是集中在一起的 例如,您可以发送:
你好代码>
你好吗?
但您可能会收到:
你好!你好吗?
或:
你好!如何使用ar
e你?
(或类似的东西)
要解决这个问题,您必须应用称为“长度前缀”的东西。长度前缀(或长度前缀)是指在发送消息之前,将其长度(字符/字节数)放在消息的开头。通过这样做,端点将准确地知道每条消息要读取多少字节。因此,将消息部分或集中在一起不会有问题
对于初学者来说,这不是最简单的事情,因为要让它在两方面都正常工作,您必须正确地构造代码。所以我创建了两个类来处理这个问题。请参阅下面的示例,了解如何使用它们进行简单的基于文本消息的通信
链接到来源:
链接到C#来源:
编辑(2019-11-08)
不久前,我做了一个升级版本,代码结构和错误处理都稍微好一点。对于感兴趣的人,可以在此处下载新代码(仅限VB.NET):
示例用法
注意,在这些示例中,Client
并不是指客户端,而是指TcpClient
服务器端
首先为ExtendedTcpClient
声明一个新变量,并确保
在声明中包含带有事件的
Dim WithEvents Client As ExtendedTcpClient
然后,您需要一个TcpListener
和一个计时器来检查传入连接
Dim Listener As New TcpListener("0.0.0.0", 5555) 'Listen for any connection on port 5555.
Dim WithEvents Tmr As New System.Windows.Forms.Timer
然后您需要订阅计时器的Tick
事件
Private Sub Tmr_Tick(sender As System.Object, e As System.EventArgs) Handles Tmr.Tick
End Sub
在这里,您可以通过Listener.Pending()
方法检查传入连接。当您要接受连接时,首先要声明一个新的连接
ExtendedTcpClient
的实例。该类需要有一个
表单作为其所有者,在此应用程序中,Me
是当前表单。
然后将ExtendedTcpClient.SetNewClient()方法用于
Listener.AcceptCpcClient()
作为其参数应用
TcpClient
来自侦听器。将此代码放入Tmr\u勾选
sub:
If Listener.Pending() = True Then
Client = New ExtendedTcpClient(Me)
Client.SetNewClient(Listener.AcceptTcpClient())
End If
现在,客户机和服务器已相互连接
现在,您需要订阅
客户创建一个子对象,如下所示:
Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived
End Sub
所有接收到的数据都以字节数组的形式显示。
在PacketReceived
子菜单中,您可以将收到的数据包作为文本输出到文本框中。只需检查数据包头是否为纯文本
,然后
您可以转换接收到的数据包内容(它是一个
字节,通过e.Packet.Contents
)访问到字符串并将其放入
文本框
If e.Packet.Header = TcpMessagePacket.PacketHeader.PlainText Then
TextBox1.AppendText("Message recieved: " & System.Text.Encoding.Default.GetString(e.Packet.Contents) & Environment.NewLine)
End If
System.Text.Encoding.Default.GetString()
将字节数组转换为普通文本
在PacketReceived
sub中,您还可以让它向客户端发送“messagereceived”
Dim ResponsePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes("Message received."), TcpMessagePacket.PacketHeader.PlainText)
ResponsePacket.Send(Client.Client) 'Get the ExtendedTcpClient's underlying TcpClient.
Private Sub ServerWindow_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If Client IsNot Nothing Then Client.Disconnect()
End Sub
最后,在关闭表单时,只需断开客户端
Dim ResponsePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes("Message received."), TcpMessagePacket.PacketHeader.PlainText)
ResponsePacket.Send(Client.Client) 'Get the ExtendedTcpClient's underlying TcpClient.
Private Sub ServerWindow_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If Client IsNot Nothing Then Client.Disconnect()
End Sub
服务器端就是这样
客户端
对于客户端,您将执行与服务器端几乎相同的操作,尽管您不需要TcpListener
或计时器
Dim WithEvents Client As New ExtendedTcpClient(Me) 'The current form as its owner.
通过提供给侦听器的IP和端口连接到服务器
Client.Connect("127.0.0.1", 5555) 'Connects to localhost (your computer) at port 5555.
现在,如果您想向服务器发送文本,您可以执行以下操作(例如按钮):
TextBox2
包含要发送的文本
最后,您还需要订阅此处的PacketReceived
事件,以检查服务器的响应。在那里,您可以像服务器一样接收文本
Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived
If e.Packet.Header = TcpMessagePacket.PacketHeader.PlainText Then
TextBox1.AppendText(System.Text.Encoding.Default.GetString(e.Packet.Contents) & Environment.NewLine) 'Prints for example "Message received." from the server.
End If
End Sub
现在一切都应该正常了
链接到完整的示例项目(仅客户端到服务器):
链接到C#示例:
如果要向类添加更多标题(标题向您指示每个数据包包含的数据类型),请打开TcpMessagePacket.vb
,并在PacketHeader
枚举(位于名为常量
的区域)中添加更多值
希望这有帮助
示例项目的屏幕截图
(单击图像以获得更大的分辨率)
除了我的回答之外,请注意发送和接收数据的是TcpClient
,而不是TcpListener
。侦听器仅处理传入的连接。所以你会在客户端和服务器端都使用TcpClient
,但只有服务器端才使用TcpListener
。Thnx,这是我需要的,你做了一个很好的例子,但在这个例子中,客户端向服务器发送文本,但我需要服务器收到消息时,能够回答服务器,这可能吗?@Web.11是的,该项目不包括这一点,但我的教程包括。请参阅服务器端下的第5点:)。只需将该代码放入服务器的PacketReceived
sub。每次服务器端或客户端调用PacketReceived
事件时