Vb.net 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通信是基于流的,这意味着它不处理任何数据包。因此,您收到的消息可能是部分的,也可能是集中在一起的 例如,您可以

我要找的只是Windows窗体VB.Net上的一个简单的TCPClient/Listner示例。我是个新手,Microsoft TCPClient/Listner类示例不是我想要的。我所寻找的只是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
    事件时