System.Net.Sockets的使用方法示例。

本文分享了.net中System.Net.Sockets的使用示例代码。代码实现了UDP多路广播聊天实用工具,包含初始化、启动侦听器线程、数据发送与接收等功能,还处理了异常情况,如无法联接多路广播组等。

有不少网友很关心.net中的System.Net.Sockets的使用方法,先将我收集到的示例代码和大家共享一下。

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

Public Class Chat
    Private Shared m_Client As UDPClient

    Private Shared ListenerPort As Integer = 8080
    Private Shared SenderPort As Integer = 8080
    Private Shared LocalPort As Integer
    Private Shared RemotePort As Integer

    Private Shared m_szHostName As String

    Private Shared m_GroupAddress As IPAddress
    Private Shared m_LocalHost As IPHostEntry
    Private Shared m_RemoteEP As IPEndPoint

    Private Shared m_Done As Boolean = False

    Public Shared Sub Usage()
        Console.WriteLine("UDP 多路广播聊天实用工具")
        Console.WriteLine("/n用法::")
        Console.WriteLine("chat.exe")
    End Sub

    Public Shared Sub Main()
        LocalPort = SenderPort
        RemotePort = ListenerPort
        Dim args As String() = Environment.GetCommandLineArgs()

        If (args.Length > 1) Then
            ' 输出帮助消息,因为此实用工具不采用任何参数
            Usage()
            Exit Sub
        End If

        m_szHostName = DNS.GetHostName()
        m_LocalHost = DNS.GetHostByName(m_szHostName)

        Console.WriteLine("本地端口:{0},远程端口:{1}", LocalPort, RemotePort)
        Console.WriteLine("正在初始化...")

        Initialize()
        Console.WriteLine("正在启动侦听器线程...")

        Dim t As Thread
        t = New Thread(AddressOf Listener)
        t.Start()

        Dim buffer() As Byte
        Dim ASCII As Encoding = Encoding.ASCII

        Dim m_ShuttingDown As Boolean = False

        While (Not (m_ShuttingDown))
            Dim s As String = Console.ReadLine()

            If (s.Length = 0) Then
                'continue()
            End If

            If (String.Compare(s, 0, "@", 0, 1) = 0) Then
                m_Done = True
                ' 将结束符发送给我们自己,
                ' 以便接收线程可以关闭
                s = m_szHostName & ":@"
                m_ShuttingDown = True
            Else
                s = m_szHostName + ":" & s
            End If

            ReDim buffer(s.Length + 1)

            ' 将数据发送给远程对方主机

            Dim len As Integer = ASCII.GetBytes(s.ToCharArray(), 0, s.Length, buffer, 0)
            Dim ecode As Integer = m_Client.Send(buffer, len, m_RemoteEP)

            If (ecode <= 0) Then Console.WriteLine("发送时出错:" & ecode)
        End While

        t.Abort()
        t.Join()
        Console.WriteLine("正在关闭连接...")
        Terminate()
    End Sub 'Main


    Public Shared Sub Terminate()
        m_Client.DropMulticastGroup(m_GroupAddress)
    End Sub

    Public Shared Sub Initialize()
        ' 实例化 UDPCLient
        m_Client = New UDPClient(LocalPort)

        ' 创建多路广播组对象
        m_GroupAddress = IPAddress.Parse("224.0.0.1")

        ' 联接组
        Try
            m_Client.JoinMulticastGroup(m_GroupAddress, 100)
        Catch Exc As Exception
            Console.WriteLine("无法联接多路广播组")
        End Try

        ' 创建对方主机的终结点
        m_RemoteEP = New IPEndPoint(m_GroupAddress, RemotePort)

    End Sub

    Public Shared Sub Listener()
        ' 侦听器等待数据到来
        ' 并用缓冲区保存它。

        Try
            Thread.Sleep(2000) ' 确保 client2 正在接收
            Dim ASCII As Encoding = Encoding.ASCII

            While (Not m_Done)
                Dim endpoint As IPEndPoint
                Dim data() As Byte = m_Client.Receive((endpoint))

                Dim strData As String = ASCII.GetString(data)

                If strData.IndexOf(":@") > 0 Then

                    ' 我们接收到一个终止指示,
                    ' 现在我们必须确定它是来
                    ' 自我们的主线程的关闭,
                    ' 还是来自其他地方

                    Dim separators() As Char = {CChar(":")}
                    Dim vars() As String = strData.Split(separators)

                    If (vars(0) = m_szHostName) Then
                        ' 这是来自我们自己的线程,因此立即结束
                        Console.WriteLine("正在关闭侦听器线程...")

                        ' 此过程应已由主线程完成了,但为
                        ' 安全起见,我们再执行一次
                        m_Done = True
                    Else
                        ' 这是来自其他地方的
                        Console.WriteLine("{0} 已离开对话", vars(0))
                    End If
                Else
                    ' 这是从其他地方以及我们自己
                    ' 处接收到的正常数据
                    ' 在输出前,查看它是否来自我
                    ' 们自己
                    If (strData.IndexOf(":") > 0) Then
                        Dim separators() As Char = {CChar(":")}
                        Dim vars() As String = strData.Split(separators)

                        If (vars(0) <> m_szHostName) Then
                            Console.WriteLine(strData)
                        End If
                    End If
                End If
            End While
        Catch
            console.WriteLine(Environment.StackTrace)
            Exit Sub
        End Try
        Console.WriteLine("侦听器线程已完成...")
    End Sub

End Class

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值