您的位置:首页 > 其它

使用UDP发送和接收消息

2007-06-05 13:11 393 查看
[align=left]Imports System.Net[/align]
[align=left]Imports System.Threading[/align]
[align=left]Imports System.Text[/align]
[align=left]Imports System.Net.Sockets[/align]
[align=left] [/align]
[align=left]Module Module1[/align]
[align=left] [/align]
[align=left] Dim PortNumber As Integer = 1984 '侦听端口号[/align]
[align=left] Dim Cmd As String = "Chat:" '提示符[/align]
[align=left] Dim listener As Socket '侦听socket[/align]
[align=left] Dim tListener As Thread '侦听线程[/align]
[align=left] Dim Prompted As Boolean = False '用于线程间同步的标志变量[/align]
[align=left] [/align]
[align=left] Sub Main()[/align]
[align=left] Welcome() '欢迎信息[/align]
[align=left] StartListener() '开始侦听[/align]
[align=left] StartChatting() '准备好让用户发送消息[/align]
[align=left] End Sub[/align]
[align=left] [/align]
[align=left] Private Sub Welcome()[/align]
[align=left] Dim txtMessage As String = vbCrLf & "Welcome! I am a console application for LAN chatting." & vbCrLf[/align]
[align=left] Console.WriteLine(txtMessage)[/align]
[align=left] End Sub[/align]
[align=left] [/align]
[align=left] Private Sub StartListener()[/align]
[align=left] Dim ready As Boolean = False[/align]
[align=left] Dim LocalPoint As IPEndPoint[/align]
[align=left] Dim msg As String[/align]
[align=left] [/align]
[align=left] While Not ready '向用户询问侦听端口号。用户可以直接回车,表示选择默认的。[/align]
[align=left] msg = GetParams("===Now, enter the local port you want to listen(" & PortNumber & "):")[/align]
[align=left] If msg = "" Then msg = PortNumber[/align]
[align=left] Try[/align]
[align=left] PortNumber = Int(msg)[/align]
[align=left] LocalPoint = New IPEndPoint(Dns.GetHostByName(Dns.GetHostName).AddressList(0), PortNumber)[/align]
[align=left] listener = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)[/align]
[align=left] listener.Bind(LocalPoint)[/align]
[align=left] ready = True[/align]
[align=left] Catch ex As Exception[/align]
[align=left] Console.WriteLine("※※※ERROR※※※ " & vbCrLf & ex.Message & vbCrLf)[/align]
[align=left] End Try[/align]
[align=left] End While[/align]
[align=left] [/align]
[align=left] tListener = New Thread(AddressOf thrListener)[/align]
[align=left] tListener.Start()[/align]
[align=left] End Sub[/align]
[align=left] [/align]
[align=left] Private Sub StartChatting()[/align]
[align=left] Dim RemoteHost As String = Dns.GetHostName[/align]
[align=left] Dim RemotePort As Integer = 1984[/align]
[align=left] Dim RemotePoint As IPEndPoint[/align]
[align=left] Dim ready As Boolean = False[/align]
[align=left] Dim msg As String[/align]
[align=left] [/align]
[align=left] While Not ready '向用户询问发送消息的目标主机和端口。用户可以直接回车,表示选择默认的。[/align]
[align=left] msg = GetParams("---enter the name of the one you want to chat with(" & RemoteHost & "):")[/align]
[align=left] If Not msg = "" Then RemoteHost = msg[/align]
[align=left] msg = GetParams("---enter the port number that guy listening at(" & RemotePort & "):")[/align]
[align=left] If msg = "" Then msg = RemotePort[/align]
[align=left] Try[/align]
[align=left] RemotePort = Int(msg)[/align]
[align=left] RemotePoint = New IPEndPoint(Dns.GetHostByName(RemoteHost).AddressList(0), RemotePort)[/align]
[align=left] ready = True[/align]
[align=left] Catch ex As Exception[/align]
[align=left] Console.WriteLine("※※※ERROR※※※ " & vbCrLf & ex.Message & vbCrLf)[/align]
[align=left] End Try[/align]
[align=left] End While[/align]
[align=left] [/align]
[align=left] Console.WriteLine()[/align]
[align=left] Console.WriteLine("OK, now you can chat. Type ""help"" to find out what you can do.")[/align]
[align=left] Console.WriteLine()[/align]
[align=left] [/align]
[align=left] Dim sender As New UdpClient[/align]
[align=left] Dim Message As String = Prompt()[/align]
[align=left] While True '用户现在可以开始发送消息[/align]
[align=left] Prompted = False[/align]
[align=left] Select Case Message.ToLower[/align]
[align=left] Case "exit"[/align]
[align=left] Exit While[/align]
[align=left] Case "help"[/align]
[align=left] ShowHelp()[/align]
[align=left] Case Else[/align]
[align=left] Dim ByArr As Byte() = Encoding.Unicode.GetBytes(Message)[/align]
[align=left] sender.Send(ByArr, ByArr.Length, RemotePoint) '发出消息[/align]
[align=left] End Select[/align]
[align=left] Message = Prompt()[/align]
[align=left] End While[/align]
[align=left] [/align]
[align=left] tListener.Abort()[/align]
[align=left] End[/align]
[align=left] End Sub[/align]
[align=left] [/align]
[align=left] Private Function GetParams(ByVal Msg As String) As String[/align]
[align=left] Console.Write(Msg)[/align]
[align=left] Return Console.ReadLine[/align]
[align=left] End Function[/align]
[align=left] [/align]
[align=left] Private Function Prompt() As String[/align]
[align=left] If Not Prompted Then[/align]
[align=left] Console.Write(Cmd)[/align]
[align=left] Prompted = True[/align]
[align=left] End If[/align]
[align=left] Return Console.ReadLine[/align]
[align=left] End Function[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] Private Sub thrListener() '侦听线程[/align]
[align=left] Dim bytes(4096) As Byte[/align]
[align=left] Dim NumGet As Integer[/align]
[align=left] Dim Msg As String[/align]
[align=left] [/align]
[align=left] While True[/align]
[align=left] Debug.WriteLine("Waiting for a message...")[/align]
[align=left] NumGet = listener.Receive(bytes) '接收[/align]
[align=left] Prompted = False[/align]
[align=left] Msg = Encoding.Unicode.GetString(bytes, 0, NumGet) '与发送消息一样使用unicode编码[/align]
[align=left] Console.WriteLine(vbCrLf & ">>>>>>>>>" & Msg & vbCrLf)[/align]
[align=left] If Not Prompted Then[/align]
[align=left] Console.Write(Cmd)[/align]
[align=left] Prompted = True[/align]
[align=left] End If[/align]
[align=left] End While[/align]
[align=left] End Sub[/align]
[align=left] [/align]
[align=left] Private Sub ShowHelp()[/align]
[align=left] Console.WriteLine("")[/align]
[align=left] Console.WriteLine("========================================================================")[/align]
[align=left] Console.WriteLine("This program is very simple, you can type ""exit"" to exit program.")[/align]
[align=left] Console.WriteLine("========================================================================")[/align]
[align=left] Console.WriteLine("")[/align]
[align=left] End Sub[/align]
[align=left] [/align]
[align=left]End Module[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: