.NET基于UDP协议的聊天程序

     最近做实验要求实现一个UDP的聊天小程序,这个东西在VS.NET里面的MSDN里面有实例代码。我在这里还是做一些介绍,并加了一些扩充!

     开发环境:VS.NET 2005(VB.NET)

     1.新建一个解决方案,命名为UDPDemo;
     2.在该解决方案下新建两个项目,分别命名为:ServerDemo,ClientDemo;
项目层次图,如下:

     ServerDemo项目下,在FrmMain窗体中添加一个文本框,命名为txtMessage,允许多行。FrmMain.vb 代码如下:

Imports  System
Imports  System.Net
Imports  System.Net.Sockets
Imports  System.Text

ExpandedBlockStart.gifContractedBlock.gif
Public   Class FrmMain Class FrmMain
    
Private Const listenPort As Integer = 11000
    
Private done As Boolean = False

ExpandedSubBlockStart.gifContractedSubBlock.gif    
Private Sub StartListener()Sub StartListener()
        
Dim listener As New UdpClient(listenPort)
        
Dim groupEP As New IPEndPoint(IPAddress.Any, listenPort)
        
Try
            
While Not done
                
Me.Write("Waiting for broadcast" & vbCrLf)
                
Dim bytes As Byte() = listener.Receive(groupEP)
                
Me.Write(String.Format("Received broadcast from {0} :" & vbCrLf, groupEP.ToString()))
                
Me.Write(Encoding.ASCII.GetString(bytes, 0, bytes.Length) & vbCrLf)
            
End While
        
Catch e As Exception
            Console.WriteLine(e.ToString())
        
Finally
            listener.Close()
        
End Try
    
End Sub
 'StartListener

ExpandedSubBlockStart.gifContractedSubBlock.gif    
Private Sub FrmMain_Load()Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        
Dim _Thread As System.Threading.Thread = Nothing
        
Try
            _Thread 
= New System.Threading.Thread(AddressOf Me.StartListener)
            _Thread.Start()
        
Catch ex As Exception
            
MsgBox(ex.Message, MsgBoxStyle.Critical)
        
End Try
    
End Sub


ExpandedSubBlockStart.gifContractedSubBlock.gif    
Private Sub Write()Sub Write(ByVal str As String)
        
Me.txtMessage.BeginInvoke(New Action(Of String)(AddressOf Me.txtMessage.AppendText), str)
    
End Sub


ExpandedSubBlockStart.gifContractedSubBlock.gif    
Private Sub FrmMain_FormClosing()Sub FrmMain_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        done 
= True
        Application.ExitThread()
    
End Sub

End Class

 

     ClientDemo项目下,在FrmMain窗体中添加控件,如图所示:

     代码部分如下:

Imports  System
Imports  System.Net
Imports  System.Net.Sockets
Imports  System.Text

ExpandedBlockStart.gifContractedBlock.gif
Public   Class FrmMain Class FrmMain

ExpandedSubBlockStart.gifContractedSubBlock.gif    
Private Sub Send()Sub Send(ByVal str As String)
        
Dim s As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
        
Dim broadcast As IPAddress = IPAddress.Parse(Me.txtIPAddress.Text.Trim())
        
Dim sendbuf As Byte() = Encoding.ASCII.GetBytes(str)
        
Dim ep As New IPEndPoint(broadcast, 11000)
        s.SendTo(sendbuf, ep)

        
Me.Write(String.Format("向服务器发送消息:{0}{1}{2}", vbCrLf, str, vbCrLf))
    
End Sub


ExpandedSubBlockStart.gifContractedSubBlock.gif    
Private Sub btnClose_Click()Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
        Application.Exit()
    
End Sub


ExpandedSubBlockStart.gifContractedSubBlock.gif    
Private Sub btnSend_Click()Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
        
Me.Send(Me.txtMessage.Text)
        
Me.txtMessage.Text = String.Empty
    
End Sub


ExpandedSubBlockStart.gifContractedSubBlock.gif    
Private Sub Write()Sub Write(ByVal str As String)
        
Me.txtInfo.BeginInvoke(New Action(Of String)(AddressOf Me.txtInfo.AppendText), str)
    
End Sub

End Class

 

     需要注意的是,广播地址应为服务端运行的主机地址!

     这个程序可以基本实现了UDP通讯,但是有个问题,就是服务端程序关闭后,其监听线程仍然还在后台执行着,这个问题不知道如何解决!

转载于:https://www.cnblogs.com/ajayumi/archive/2008/11/18/1335727.html

以下是一个基于UDP协议的简单聊天程序的Java代码示例: 服务端代码: ```java import java.io.IOException; import java.net.*; public class UDPServer { public static void main(String[] args) throws IOException { // 创建UDP套接字 DatagramSocket serverSocket = new DatagramSocket(8888); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while (true) { // 接收客户端发送的数据 DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); String message = new String(receivePacket.getData()); System.out.println("Received message from " + receivePacket.getAddress() + ": " + message); // 发送响应数据给客户端 InetAddress clientAddress = receivePacket.getAddress(); int clientPort = receivePacket.getPort(); String responseMessage = "Hello from server!"; sendData = responseMessage.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort); serverSocket.send(sendPacket); } } } ``` 客户端代码: ```java import java.io.IOException; import java.net.*; public class UDPClient { public static void main(String[] args) throws IOException { // 创建UDP套接字 DatagramSocket clientSocket = new DatagramSocket(); byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while (true) { // 发送数据给服务端 InetAddress serverAddress = InetAddress.getByName("127.0.0.1"); int serverPort = 8888; String message = "Hello from client!"; sendData = message.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, serverPort); clientSocket.send(sendPacket); // 接收服务端发送的响应数据 DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); String responseMessage = new String(receivePacket.getData()); System.out.println("Received message from " + receivePacket.getAddress() + ": " + responseMessage); } } } ``` 在这个聊天程序中,服务端和客户端均使用UDP套接字进行通信。服务端首先创建一个UDP套接字,并绑定到指定的端口号。然后进入一个无限循环,等待接收客户端发送的数据。当服务端接收到客户端发送的数据后,它会打印出接收到的消息,并将响应消息发送给客户端。 客户端创建一个UDP套接字,并指定服务端的IP地址和端口号,然后进入一个无限循环,等待用户输入要发送的消息。当客户端输入消息后,它会将消息发送给服务端,并等待服务端的响应。当客户端接收到服务端的响应后,它会打印出接收到的消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值