Visual Basic UDPClient服务器/客户端模型?

时间:2013-04-23 03:43:43

标签: vb.net client-server chat udpclient

所以我试图制作一个非常简单的系统,将消息从客户端发送到服务器(以及稍后从服务器发送到客户端,但宝贝先步骤)。我不确定如何使用UDPClient发送和接收消息(尤其是接收消息),主要是因为我没有触发ReceiveMessage()功能的任何内容,我不确定什么会。

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

所以我的问题基本上是:如何轻松使用UDPClient,如何让这个系统工作以及执行这种连接有哪些提示?我应该注意什么(线程,代码问题等)?

Source

2 个答案:

答案 0 :(得分:4)

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

设置接收器,

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

  2. 创建新线程以避免在接收数据时阻塞

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

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

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

  6. 设置发件人

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

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

    3. 我建议您通过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

答案 1 :(得分:0)

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