vb.net udp局域网聊天(可以获得网内在线列表)
来源:互联网 发布:域名被qq管家拦截 编辑:程序博客网 时间:2024/04/28 17:24
刚刚接触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 + "离线了!===")
ListBox2.Items.Remove(Dns.GetHostByAddress(revip).HostName)
End If
End If
Catch ex As Exception
End Try
End While
End Sub
'发送UDP消息
Private Sub UdpSend(ByVal msg As String, ByVal sendip As String)
'实例化要连接的ip和port
IpEndPoint = New IPEndPoint(Dns.Resolve(sendip.ToString).AddressList(0), 8080)
Dim bytes As Byte() = Encoding.Unicode.GetBytes(msg)
Try
udp.Send(bytes, bytes.Length, IpEndPoint)
Catch ex As Exception
End Try
End Sub
'发送UDP消息——按钮
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If txtmsg.Text <> "" Then
'ip2 = Integer.Parse(TextBox1.Text)
UdpSend(txtmsg.Text, sendip)
ListBox1.Items.Add(Dns.GetHostName + ": " + txtmsg.Text)
txtmsg.Text = ""
End If
End Sub
Private Sub ListBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox2.SelectedIndexChanged
sendip = Dns.Resolve(ListBox2.SelectedItem).AddressList(0).ToString
Label1.Text = " " + Dns.GetHostByAddress(sendip).HostName + "[ " + sendip + " ] 发送消息"
'TextBox1.Text = sendip.Substring(11, 3)
End Sub
'关闭——按钮
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
getlist("bye")
udp.Close()
udp1.Close()
End
End Sub
'更新列表——按钮
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
blnnew = True
'thread1 = New Thread(New ThreadStart(AddressOf getlist))
'thread1.Start()
ListBox2.Items.Clear()
getlist("ask")
End Sub
- vb.net udp局域网聊天(可以获得网内在线列表)
- 局域网聊天(UDP)
- 用UDP实现局域网内聊天程序
- 局域网广播(聊天)程序UDP
- udp局域网聊天
- UDP局域网内广播消息(转载)
- VB学习之局域网聊天
- net send 局域网聊天
- [VB.NET]局域网内连接sql服务器(msde2000)连接不上的问题,请教!
- VB.NET 获取本机在局域网内的IP
- 【项目源码】- 【局域网聊天】android实现局域网聊天 - UDP实现
- UDP局域网内广播消息
- UDP局域网内广播消息
- VB.NET聊天程序
- Windows8 udp广播局域网聊天程序
- 基于UDP的局域网聊天实现
- UDP实现局域网多人聊天
- 查看局域网内在线ip
- Acer TravelMate 3261AWXM
- 深入浅出面向对象的复用(2)
- 如何修改apache的默认web端口
- ASP.NET程序中常用的三十三种代码
- Java内存泄露问题
- vb.net udp局域网聊天(可以获得网内在线列表)
- onkeydown,onkeyup,onkeypress,onclick,ondblclick
- ogm 转 avi
- 系统用了一段时间后 硬盘上好几个磁盘里都显示有 FOUND.000 等文件夹
- 面向对象的软件工程-规划阶段
- 单参构造函数的使用
- Windows API写的clock程序
- google一些鲜为人知的搜索技巧-1
- C# String.Empty, ==,String.IsNullOrEmpty(str)