刚刚接触sockets 用UDP协议,做了一个局域网聊天的程序。有关于获得在线列表的问题上,参考了很多的方法,最终找到的一个简单的解决方法。每次有新程序打开时,都会向网内广播一个询问消息,然后其他程序接收到后,会返回一个应答消息。这样就解决了,获得在线列表的问题。可能还会有更好的方法吧,但才疏学浅啊!慢慢学习吧!
下面是源代码(vb.net)
Imports System.Net
Imports System.io
Imports System.Text
Imports System.Threading
Imports System.Net.Sockets
Dim thread As thread
Dim thread1 As thread
Dim IpEndPoint As IPEndPoint
Dim udp As UdpClient
Dim sendip As String
Dim revip As String
Dim ip2 As Integer
Dim ip1 As String
Dim udp1 As New UdpClient(11000)
Dim GroupAddress As IPAddress = IPAddress.Parse("224.0.0.1")
Dim GroupEndPoint As New IpEndPoint(GroupAddress, 11000)
Dim blnnew As Boolean = False
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
udp = New UdpClient(8080)
thread = New Thread(New ThreadStart(AddressOf udpreceive))
thread.Start()
'ip1 = Dns.Resolve(Dns.GetHostName).AddressList(0).ToString().Substring(0, 11)
udp1.JoinMulticastGroup(GroupAddress, 100)
thread1 = New Thread(New ThreadStart(AddressOf GroupReceive))
thread1.Start()
getlist("ask")
sendip = Dns.Resolve(Dns.GetHostName).AddressList(0).ToString
Label1.Text = " " + Dns.GetHostByAddress(sendip).HostName + "[ " + sendip + " ] 发送消息"
End Sub
'接收UDP消息
Private Sub udpreceive()
While True
Dim udpendpoint As IPEndPoint
Dim bytes As Byte()
Dim returnData As String
Dim revhostname As String
Try
bytes = udp.Receive(udpendpoint)
returnData = Encoding.Unicode.GetString(bytes)
revip = udpendpoint.Address.ToString
If revip <> "" And revip <> Dns.Resolve(Dns.GetHostName).AddressList(0).ToString Then
If returnData = "here" Then
list(revip)
Else
revhostname = Dns.GetHostByAddress(revip).HostName
'MsgBox(Dns.Resolve(revhostname).AddressList(0).ToString)
ListBox1.Items.Add(revhostname + ": " + returnData)
'TextBox1.Text = revip.Substring(11, 3)
End If
End If
Catch ex As Exception
End Try
End While
End Sub
''获取可联机计算机列表(向局域网内广播消息)
Private Sub getlist(ByVal msg As String)
Dim bytes As Byte() = Encoding.Unicode.GetBytes(msg)
udp1.Send(bytes, bytes.Length, GroupEndPoint)
End Sub
'过滤列表
Private Sub list(ByVal listip As String)
Dim i As Integer
Dim listiphost
Dim ipflag As Boolean
ipflag = False
listiphost = Dns.GetHostByAddress(listip).HostName
' MsgBox(listiphost)
For i = 0 To ListBox2.Items.Count - 1
If StrComp(listiphost, ListBox2.Items.Item(i).ToString) = 0 Then
'MsgBox(0)
ipflag = True
Exit Sub
End If
Next
If ipflag = False Then
If listip <> "" And listip <> Dns.Resolve(Dns.GetHostName).AddressList(0).ToString Then
ListBox2.Items.Add(listiphost)
If blnnew = False Then
ListBox1.Items.Add("***用户:" + listiphost + "上线了!***")
End If
End If
End If
End Sub
'接收UDP广播(在线计算机响应)
Private Sub GroupReceive()
Dim udpendpoint As IPEndPoint
Dim bytes As Byte()
Dim returnData As String
While True
Try
bytes = udp1.Receive(udpendpoint)
returnData = Encoding.Unicode.GetString(bytes)
revip = udpendpoint.Address.ToString
If revip <> "" And revip <> Dns.Resolve(Dns.GetHostName).AddressList(0).ToString Then
If returnData = "ask" Then
UdpSend("here", revip)
list(revip)
End If
If returnData = "bye" Then
ListBox1.Items.Add("===用户:" + Dns.GetHostByAddress(revip).HostName + "离线了!===")