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

 

原创粉丝点击