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

服务器端

  1. 首先为ExtendedTcpClient声明一个新variables,并确保在WithEvents中包含WithEvents

     Dim 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是当前的表单。
    然后,使用带有Listener.AcceptTcpClient()ExtendedTcpClient.SetNewClient()方法作为从侦听器应用TcpClient的参数。 把这个代码放在Tmr_Tick子文件中:

     If Listener.Pending() = True Then Client = New ExtendedTcpClient(Me) Client.SetNewClient(Listener.AcceptTcpClient()) End If 

    现在客户端和服务器相互连接。

  4. 现在您需要订阅客户端的PacketReceived事件。 创build一个子如下所示:

     Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived End Sub 

    所有接收到的数据以字节数组呈现。 在PacketReceivedPacketReceived您可以将接收到的数据包作为文本输出到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()会将字节数组转换为普通文本。

  5. PacketReceivedPacketReceived您也可以使“发送消息”发送给客户端。

     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. 最后,在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 

这就是服务器端。


客户端

  1. 对于客户端来说,你可以做的和服务器端几乎一样,不过你不需要TcpListenerTimer

     Dim Client As New ExtendedTcpClient(Me) 'The current form as it's owner. 
  2. 通过您给予侦听器的IP和端口连接到服务器。

     Client.Connect("127.0.0.1", 5555) 'Connects to localhost (your computer) at port 5555. 
  3. 现在,如果你想发送文本到服务器,你会做这样的事情(例如一个button):

     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

如果你想向类中添加更多的头信息(头文件指明了它是什么types的数据包),只需打开TcpMessagePacket.vb并在PacketHeader枚举(位于称为Constants的区域)中添加更多的值。

希望这可以帮助!


示例项目的屏幕截图

(点击图片查看大图)

ExtendedTcpClient示例项目输出