VB.net基础:使用UDP发送和接收消息

来源:互联网 发布:棋牌游戏源码下载 编辑:程序博客网 时间:2024/04/27 23:59

VB.net基础:使用UDP发送和接收消息 出处:www.csdn.net
 
[ 2004-10-27 00:06:57 ]  作者:YidingHe  责任编辑:liyalin

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

Module Module1

    Dim PortNumber As Integer = 1984    '侦听端口号

    Dim Cmd As String = "Chat:"         '提示符

    Dim listener As Socket              '侦听socket

    Dim tListener As Thread             '侦听线程

    Dim Prompted As Boolean = False     '用于线程间同步的标志变量

     Sub Main()

        Welcome()                       '欢迎信息

        StartListener()                 '开始侦听

        StartChatting()                 '准备好让用户发送消息

    End Sub

     Private Sub Welcome()

        Dim txtMessage As String = vbCrLf & "Welcome! I am a console application for LAN chatting." & vbCrLf

        Console.WriteLine(txtMessage)

    End Sub

     Private Sub StartListener()

        Dim ready As Boolean = False

        Dim LocalPoint As IPEndPoint

        Dim msg As String

         While Not ready '向用户询问侦听端口号。用户可以直接回车,表示选择默认的。

            msg = GetParams("===Now, enter the local port you want to listen(" & PortNumber & "):")

            If msg = "" Then msg = PortNumber

            Try

                PortNumber = Int(msg)

                LocalPoint = New IPEndPoint(Dns.GetHostByName(Dns.GetHostName).AddressList(0), PortNumber)

                listener = New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)

                listener.Bind(LocalPoint)

                ready = True

            Catch ex As Exception

                Console.WriteLine("※※※ERROR※※※ " & vbCrLf & ex.Message & vbCrLf)

            End Try

        End While

         tListener = New Thread(AddressOf thrListener)

        tListener.Start()

    End Sub

     Private Sub StartChatting()

        Dim RemoteHost As String = Dns.GetHostName

        Dim RemotePort As Integer = 1984

        Dim RemotePoint As IPEndPoint

Dim ready As Boolean = False

        Dim msg As String

         While Not ready '向用户询问发送消息的目标主机和端口。用户可以直接回车,表示选择默认的。

            msg = GetParams("---enter the name of the one you want to chat with(" & RemoteHost & "):")

            If Not msg = "" Then RemoteHost = msg

            msg = GetParams("---enter the port number that guy listening at(" & RemotePort & "):")

            If msg = "" Then msg = RemotePort

            Try

                RemotePort = Int(msg)

                RemotePoint = New IPEndPoint(Dns.GetHostByName(RemoteHost).AddressList(0), RemotePort)

                ready = True

            Catch ex As Exception

                Console.WriteLine("※※※ERROR※※※ " & vbCrLf & ex.Message & vbCrLf)

            End Try

        End While

         Console.WriteLine()

        Console.WriteLine("OK, now you can chat. Type ""help"" to find out what you can do.")

        Console.WriteLine()

         Dim sender As New UdpClient

        Dim Message As String = Prompt()

        While True      '用户现在可以开始发送消息

            Prompted = False

            Select Case Message.ToLower

                Case "exit"

                    Exit While

                Case "help"

                    ShowHelp()

                Case Else

                    Dim ByArr As Byte() = Encoding.Unicode.GetBytes(Message)

                    sender.Send(ByArr, ByArr.Length, RemotePoint)   '发出消息

            End Select

            Message = Prompt()

        End While

         tListener.Abort()

        End

    End Sub

     Private Function GetParams(ByVal Msg As String) As String

        Console.Write(Msg)

        Return Console.ReadLine

    End Function

Private Function Prompt() As String

        If Not Prompted Then

            Console.Write(Cmd)

            Prompted = True

        End If

        Return Console.ReadLine

    End Function

     Private Sub thrListener() '侦听线程

        Dim bytes(4096) As Byte

        Dim NumGet As Integer

        Dim Msg As String

         While True

            Debug.WriteLine("Waiting for a message...")

            NumGet = listener.Receive(bytes)   '接收

            Prompted = False

            Msg = Encoding.Unicode.GetString(bytes, 0, NumGet) '与发送消息一样使用unicode编码

            Console.WriteLine(vbCrLf & ">>>>>>>>>" & Msg & vbCrLf)

            If Not Prompted Then

                Console.Write(Cmd)

                Prompted = True

            End If

        End While

    End Sub

     Private Sub ShowHelp()

        Console.WriteLine("")

        Console.WriteLine("========================================================================")

        Console.WriteLine("This program is very simple, you can type ""exit"" to exit program.")

        Console.WriteLine("========================================================================")

        Console.WriteLine("")

    End Sub

End Module

原创粉丝点击