TCP客户端到服务器通信

时间:2016-02-05 21:29:02

标签: vb.net winforms tcp client-server tcpclient

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

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

1 个答案:

答案 0 :(得分: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#来源:http://www.mydoomsite.com/sourcecodes/ExtendedTcpClient%20CSharp.zip

使用示例

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

服务器端

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

    Dim WithEvents Client As ExtendedTcpClient
    
  2. 然后,您需要TcpListenerTimer来检查传入的连接。

    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 sub:

    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访问的字节到字符串并将其放入 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. 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
    
  7. 这就是服务器端。

    客户端

    1. 对于客户端,您将与服务器端完全相同,但您不需要TcpListenerTimer

      Dim 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
      
    5. 现在一切都应该正常工作!

      链接到完整的示例项目(仅限客户端到服务器):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