【问题标题】:Visual Basic UDPClient Server/Client model?Visual Basic UDPClient 服务器/客户端模型?
【发布时间】:2013-04-23 03:43:42
【问题描述】:

所以我正在尝试制作一个非常简单的系统来将消息从客户端发送到服务器(稍后也从服务器发送到客户端,但要先进行小步骤)。我不确定如何使用 UDPClient 来发送和接收消息(尤其是接收消息),主要是因为我没有任何触发 ReceiveMessage() 函数的东西,我不确定会发生什么。

源代码在此链接,请转到文件>下载。如果您只想运行 exe,它已经构建好了。

所以我的问题基本上是:我怎样才能轻松使用UDPClient,我怎样才能让这个系统工作,以及执行这种连接的一些技巧是什么?我应该注意什么(线程、代码问题等)?

Source.

【问题讨论】:

  • 你需要使用UDP吗?你看过 AMPQ 吗?尝试访问rabbitmq.com
  • Google 是你的朋友,我认为你应该在发布问题之前先尝试对其进行研究。我之前的帖子向您展示了消息传递还有其他替代方案。祝你好运
  • 我在这里提问是有原因的,因为我在谷歌搜索时没有找到适用的结果,而且我发现的结果有问题或对我来说效果不佳。

标签: vb.net client-server chat udpclient


【解决方案1】:

您首先需要设置两个UdpClients。一个客户端用于侦听,另一个用于发送数据。 (您还需要选择一个空闲/未使用端口号并知道您的目标的 IP 地址 - 您要发送数据的机器。)

要设置接收器,

  1. 使用您之前选择的端口号实例化您的 UdpClient 变量,

  2. 新建线程,避免接收数据时阻塞,

  3. 只要您想接收数据,就在客户端的接收方法上循环(循环的执行应该在新线程中),

  4. 当您收到大量数据(称为“数据包”)时,您可能需要将字节数组转换为更有意义的内容,

  5. 当您想要完成接收数据时,创建一种退出循环的方法。

要设置发件人,

  1. 使用您之前选择的端口号实例化您的 UdpClient 变量(您可能希望启用发送广播数据包的功能。这允许您向 LAN 上的所有侦听器发送数据),

  2. 当需要传输数据时,将数据转换为字节数组,然后调用Send()

我建议您快速浏览一下this

这里有一些代码可以帮助你开始......

'''''''''''''''''''''''Set up variables''''''''''''''''''''
Private Const port As Integer = 9653                         'Port number to send/recieve data on
Private Const broadcastAddress As String = "255.255.255.255" 'Sends data to all LOCAL listening clients, to send data over WAN you'll need to enter a public (external) IP address of the other client
Private receivingClient As UdpClient                         'Client for handling incoming data
Private sendingClient As UdpClient                           'Client for sending data
Private receivingThread As Thread                            'Create a separate thread to listen for incoming data, helps to prevent the form from freezing up
Private closing As Boolean = False                           'Used to close clients if form is closing

''''''''''''''''''''Initialize listening & sending subs'''''''''''''''''

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Me.Load
    InitializeSender()          'Initializes startup of sender client
    InitializeReceiver()        'Starts listening for incoming data                                             
End Sub

''''''''''''''''''''Setup sender client'''''''''''''''''

Private Sub InitializeSender()
    sendingClient = New UdpClient(broadcastAddress, port)
    sendingClient.EnableBroadcast = True
End Sub

'''''''''''''''''''''Setup receiving client'''''''''''''

Private Sub InitializeReceiver()
    receivingClient = New UdpClient(port)
    Dim start As ThreadStart = New ThreadStart(AddressOf Receiver)
    receivingThread = New Thread(start)                            
    receivingThread.IsBackground = True                            
    receivingThread.Start()                                       
End Sub

'''''''''''''''''''Send data if send button is clicked'''''''''''''''''''

Private Sub sendBut_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sendBut.Click
    Dim toSend As String = tbSend.Text                  'tbSend is a textbox, replace it with whatever you want to send as a string
    Dim data() As Byte = Encoding.ASCII.GetBytes(toSend)'Convert string to bytes
    sendingClient.Send(data, data.Length)               'Send bytes
End Sub

'''''''''''''''''''''Start receiving loop''''''''''''''''''''''' 

Private Sub Receiver()
    Dim endPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, port) 'Listen for incoming data from any IP address on the specified port (I personally select 9653)
    While (True)                                                     'Setup an infinite loop
        Dim data() As Byte                                           'Buffer for storing incoming bytes
        data = receivingClient.Receive(endPoint)                     'Receive incoming bytes 
        Dim message As String = Encoding.ASCII.GetString(data)       'Convert bytes back to string
        If closing = True Then                                       'Exit sub if form is closing
            Exit Sub
        End If
    End While
End Sub

'''''''''''''''''''Close clients if form closes''''''''''''''''''

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    closing = True          'Tells receiving loop to close
    receivingClient.Close()
    sendingClient.Close()
End Sub

这里有一些其他示例:Herehereherehere

【讨论】:

    【解决方案2】:
    Imports System.Threading
    
    Shared client As UdpClient
    Shared receivePoint As IPEndPoint
    
    client = New UdpClient(2828) 'Port
    receivePoint = New IPEndPoint(New IPAddress(0), 0)
    
    Dim readThread As Thread = New Thread(New ThreadStart(AddressOf WaitForPackets))
    readThread.Start()
    
    Public Shared Sub WaitForPackets()
        While True
            Dim data As Byte() = client.Receive(receivePoint)
            Console.WriteLine("=" + System.Text.Encoding.ASCII.GetString(data))
        End While
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多