有不少网友很关心.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