TCP客户端到服务器通信
我正在寻找的是Windows Form VB.Net上的一个简单的TCPClient / Listner示例。 我是一个新手和Microsoft TCPClient / Listner类的例子不是我在找什么。 我正在寻找的是TCPClient发送消息和TCPListener获取消息并发送消息“我收到了你的消息”?
一点帮助将是伟大的。 我有一些代码,但只是发送消息到服务器,而不是从服务器回到客户端..任何帮助将非常感激..
TCP通信就是所谓的基于stream的,这意味着它不处理任何数据包。 由于接收到的这些消息可能是部分的或集中在一起的。
你可以例如发送:
Hello!
How are you?
但是您可能会收到:
Hello!How are you?
要么:
Hello!How ar
e you?
(或类似的东西)
要解决这个问题,你必须应用一个叫做“length-prefixing”的东西。 长度前缀(或长度前缀)是指在发送消息之前,将其长度(字符数)放在其开头。 然后terminal可以读取它,然后根据它的长度读取每条消息,因此不会有部分消息或消息混在一起的问题。
这不是最简单的事情,但我已经创build了两个类,将为你做所有这些。 请参阅下面的示例,了解如何将它们用于简单的基于消息的通信。
链接到源: http : //www.mydoomsite.com/sourcecodes/ExtendedTcpClient.zip
链接到C#源代码: http : //www.mydoomsite.com/sourcecodes/ExtendedTcpClient%20CSharp.zip
用法示例
请注意,在这些示例中, Client
不会引用客户端 ,而是引用TcpClient 。
服务器端
-
首先为
ExtendedTcpClient
声明一个新variables,并确保在WithEvents
中包含WithEvents
。Dim WithEvents Client As ExtendedTcpClient
-
然后你将需要一个
TcpListener
和一个Timer
来检查传入的连接。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
是当前的表单。
然后,使用带有Listener.AcceptTcpClient()
的ExtendedTcpClient.SetNewClient()
方法作为从侦听器应用TcpClient
的参数。 把这个代码放在Tmr_Tick
子文件中:If Listener.Pending() = True Then Client = New ExtendedTcpClient(Me) Client.SetNewClient(Listener.AcceptTcpClient()) End If
现在客户端和服务器相互连接。
-
现在您需要订阅客户端的
PacketReceived
事件。 创build一个子如下所示:Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived End Sub
所有接收到的数据以字节数组呈现。 在
PacketReceived
子PacketReceived
您可以将接收到的数据包作为文本输出到TextBox
。 只要检查包头是否为PlainText
,然后可以将接收到的包内容(即通过e.Packet.Contents
访问的字节数组)转换为string并将其放入TextBox
。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
子PacketReceived
您也可以使“发送消息”发送给客户端。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.
-
最后,在closures表单时,只需要断开客户端。
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
和Timer
。Dim Client As New ExtendedTcpClient(Me) 'The current form as it's owner.
-
通过您给予侦听器的IP和端口连接到服务器。
Client.Connect("127.0.0.1", 5555) 'Connects to localhost (your computer) at port 5555.
-
现在,如果你想发送文本到服务器,你会做这样的事情(例如一个button):
Dim MessagePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes(TextBox2.Text), TcpMessagePacket.PacketHeader.PlainText) MessagePacket.Send(Client.Client)
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
现在一切都应该工作!
链接到一个完整的示例项目(仅客户端到服务器): http : //www.mydoomsite.com/sourcecodes/TCP%20Messaging%20System.zip
链接到C#示例: http : //www.mydoomsite.com/sourcecodes/CSharp%20TCP%20Messaging%20System.zip
如果你想向类中添加更多的头信息(头文件指明了它是什么types的数据包),只需打开TcpMessagePacket.vb
并在PacketHeader
枚举(位于称为Constants
的区域)中添加更多的值。
希望这可以帮助!
示例项目的屏幕截图
(点击图片查看大图)