TCP客户端到服务器通信

问题描述 投票:0回答:1

我正在寻找的是Windows Form VB.Net上的一个简单的TCPClient / Listner示例。我是新手,Microsoft TCPClient / Listner类示例不是我想要的。我正在寻找的是TCPClient发送消息和TCPListener获取消息并发回消息“我收到你的消息”?

一点点帮助会很棒。我有一些代码,但只是发送消息到服务器而不是从服务器回到客户端..任何帮助将非常感谢..

vb.net winforms tcp client-server tcpclient
1个回答
10
投票

TCP通信就是所谓的基于流的,这意味着它不处理任何数据包。由于这些消息可以是部分或集中在一起的。

你可以发送:

Hello!

How are you?

但你可能会收到:

Hello!How are you?

要么:

Hello!How ar

e you?

(或类似的东西)

要解决此问题,您必须应用名为“length-prefixing”的内容。长度前缀(或长度前缀)意味着在发送消息之前,将其长度(字符数)放在其开头。然后,端点可以读取它,然后端点将根据其长度读取每条消息,因此将部分消息或消息集中在一起不会出现问题。

这不是最简单的事情,但是我已经创建了两个类来完成所有这些工作。请参阅下面的示例,了解如何将它们用于简单的基于消息的通信。

链接到源:http://www.mydoomsite.com/sourcecodes/ExtendedTcpClient.zip

链接到C#source:http://www.mydoomsite.com/sourcecodes/ExtendedTcpClient%20CSharp.zip

用法示例

请注意,在这些示例中,Client不是指客户端,而是指TcpClient。

服务器端

  1. 首先为ExtendedTcpClient声明一个新变量,并确保在声明中包含WithEventsDim WithEvents Client As ExtendedTcpClient
  2. 然后你需要一个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
  3. 然后你需要订阅计时器的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.AcceptTcpClient()作为参数来应用来自侦听器的TcpClient。将此代码放在Tmr_Tick子中: If Listener.Pending() = True Then Client = New ExtendedTcpClient(Me) Client.SetNewClient(Listener.AcceptTcpClient()) End If 现在客户端和服务器相互连接。
  4. 现在您需要订阅客户端的PacketReceived事件。像这样创建一个子: Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived End Sub 所有接收的数据都以字节数组表示。在PacketReceived子中,您可以将收到的数据包作为文本输出到TextBox中。只需检查数据包标头是否为PlainText,然后您可以将接收到的数据包内容(通过e.Packet.Contents访问的字节数组)转换为字符串并将其放入TextBoxIf 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()会将字节数组转换为普通文本。
  5. 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.
  6. 最后,关闭表单时,您只需断开客户端即可。 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

这就是服务器端。


客户端

  1. 对于客户端,您将完成与服务器端几乎相同的操作,但您不需要TcpListenerTimerDim WithEvents Client As New ExtendedTcpClient(Me) 'The current form as its owner.
  2. 通过您给予监听器的IP和端口连接到服务器。 Client.Connect("127.0.0.1", 5555) 'Connects to localhost (your computer) at port 5555.
  3. 现在,如果您想将文本发送到服务器,您可以执行以下操作(例如按钮): Dim MessagePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes(TextBox2.Text), TcpMessagePacket.PacketHeader.PlainText) MessagePacket.Send(Client.Client) TextBox2包含您要发送的文本。
  4. 最后,您还需要在此订阅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

如果你想在类中添加更多标题(标题指示它是什么类型的数据包),只需打开TcpMessagePacket.vb并在PacketHeader枚举中添加更多值(位于名为Constants的区域)。

希望这可以帮助!


示例项目的屏幕截图

(单击图像以获得更大的分辨率)

ExtendedTcpClient example project output

© www.soinside.com 2019 - 2024. All rights reserved.