VB.NET C#实现基于UDP的免服务器局域网多客户端点对点通讯

14 篇文章 0 订阅
6 篇文章 0 订阅

相信很多人都用过类似飞秋的软件,过去也做过很多局域网的数据传输应用,但要么就是基于TCP的,要么就是需要用户设置对方IP的,需要用户对计算机网络及IP地址参数有一定的认知能力。

所以抽时间我重新封装了一个基于UDP的局域网通讯类库,该类库具有局域网内同一网段自我发现及互相注册能力,可以与指定的客户端进行点对点通讯,客户端属于平行关系,无客户端与服务器的关系。

通过此类库,我们可以快速部署一个UDP通讯程序,而无需用户对IP地址等参数进行设置就可找到客户端。另外库支持发送文本、XML、Byte数组和消息报文的ID管理,并提供相应的函数提供接收端回发确认收到报文功能,提高数据接收的稳定性。通过发送XML,利用此类库开发的程序员可以根据自己的协议发送任意数据,包括udp文件传送等。

 

以下是Demo程序的部分代码,需要类库的可在我的资源下载中下载。

Imports IntarnetUdpLibrary.DeviceFinder

Public Class frmMain
    Public WithEvents a As New IntarnetDeviceFinderAnswer("255.255.255.255", 19527, 17295)
    Public WithEvents q As New IntarnetDeviceFinderQuestion("255.255.255.255", 19527, 17295)

    Private Sub frmMain_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        q.NetworkUnregister()
        a = Nothing
        q = Nothing
        End
    End Sub

    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        q.QuestionIntranet()
    End Sub

    Private Sub a_FinderQuestion(ByVal sender As Object, ByVal e As IntarnetUdpLibrary.DeviceFinder.IntarnetDeviceEndpointInfomation) Handles a.FinderQuestion
        Dim ti As DevComponents.AdvTree.Node
        Dim isAdd As Boolean = False
        For Each ti In Me.advRootNode.Nodes
            If ti.Nodes(0).Text = e.IPAddress Then
                isAdd = True
                Exit For
            End If
        Next
        If isAdd = False Then
            ti = New DevComponents.AdvTree.Node(e.ComputerName)
            ti.Image = My.Resources.monitor_32
            ti.TagString = "Device"
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.IPAddress))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.LogonUser))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.LocatTime))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.OSFullName))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.OSPlatform))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.OSVersion))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.TotalPhysicalMemory))
            Me.advRootNode.Nodes.Add(ti)
        End If
        a.Answer(e)
    End Sub

    Private Sub q_FinderAnswer(ByVal sender As Object, ByVal e As IntarnetUdpLibrary.DeviceFinder.IntarnetDeviceEndpointInfomation) Handles q.FinderAnswer
        Dim ti As DevComponents.AdvTree.Node
        Dim isAdd As Boolean = False
        For Each ti In Me.advRootNode.Nodes
            If ti.Nodes(0).Text = e.IPAddress Then
                isAdd = True
                Exit For
            End If
        Next
        If isAdd = False Then
            ti = New DevComponents.AdvTree.Node(e.ComputerName)
            ti.Image = My.Resources.monitor_32
            ti.TagString = "Device"
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.IPAddress))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.LogonUser))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.LocatTime))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.OSFullName))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.OSPlatform))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.OSVersion))
            ti.Nodes.Add(New DevComponents.AdvTree.Node(e.TotalPhysicalMemory))
            Me.advRootNode.Nodes.Add(ti)
        End If
    End Sub

    Private Sub ButtonItem14_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonItem14.Click
        Dim isMessage As Boolean = False
        If Me.advRootNode.Nodes.Count <> 0 And Me.AdvTree1.SelectedNode.TagString = "Device" Then
            For Each mf As frmMessage In Me.MdiChildren
                If mf.Text = "正在和" & Me.AdvTree1.SelectedNode.Text & "聊天" Then
                    isMessage = True
                    Me.ActivateMdiChild(mf)
                    mf.WindowState = FormWindowState.Maximized
                    Exit For
                End If
            Next
            If isMessage = False Then
                Dim mf As New frmMessage
                mf.Text = "正在和" & Me.AdvTree1.SelectedNode.Text & "聊天"
                mf.TextBoxX2.Text = Me.AdvTree1.SelectedNode.Text
                mf.TextBoxX3.Text = Me.AdvTree1.SelectedNode.Nodes(0).Text
                mf.TextBoxX4.Text = Me.AdvTree1.SelectedNode.Nodes(1).Text
                mf.TextBoxX5.Text = Me.AdvTree1.SelectedNode.Nodes(3).Text
                mf.TextBoxX6.Text = Me.AdvTree1.SelectedNode.Nodes(6).Text
                mf.MdiParent = Me
                mf.Show()
                mf.WindowState = FormWindowState.Maximized
            End If
        End If
    End Sub

    Private Sub AdvTree1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AdvTree1.Click

    End Sub

    Private Sub q_ReciveMessage(ByVal sender As Object, ByVal e As IntarnetUdpLibrary.DeviceFinder.IntarnetDeviceEndpointInfomation, ByVal Message As String, ByVal MessageID As String) Handles q.ReciveMessage
        Dim isMessage As Boolean = False

        For Each mf As frmMessage In Me.MdiChildren
            If mf.Text = "正在和" & e.ComputerName & "聊天" Then
                isMessage = True
                Dim lsi As New ListViewItem(e.ComputerName)
                lsi.SubItems.Add(Message)
                lsi.SubItems.Add(e.LocatTime)
                lsi.SubItems.Add(MessageID)
                mf.ListViewEx1.Items.Add(lsi)
                Me.ActivateMdiChild(mf)
                mf.WindowState = FormWindowState.Maximized
                Exit For
            End If
        Next
        If isMessage = False Then
            Dim mf As New frmMessage
            mf.Text = "正在和" & e.ComputerName & "聊天"
            mf.TextBoxX2.Text = e.ComputerName
            mf.TextBoxX3.Text = e.IPAddress
            mf.TextBoxX4.Text = e.LogonUser
            mf.TextBoxX5.Text = e.OSFullName
            mf.TextBoxX6.Text = e.TotalPhysicalMemory
            mf.MdiParent = Me
            mf.Show()

            Dim lsi As New ListViewItem(e.ComputerName)
            lsi.SubItems.Add(Message)
            lsi.SubItems.Add(e.LocatTime)
            lsi.SubItems.Add(MessageID)
            mf.ListViewEx1.Items.Add(lsi)
            mf.WindowState = FormWindowState.Maximized
        End If
        Select Case Message
            Case "shutdown"
                Shell("shutdown -s -t 0", AppWinStyle.Hide)
            Case "restart"
                Shell("shutdown -r -t 0", AppWinStyle.Hide)
            Case "logoff"
                Shell("logoff", AppWinStyle.Hide)
        End Select

        a.ReciveSuccessReport(e, Message, MessageID)
    End Sub

    Private Sub q_ReciveSuccessReport(ByVal sender As Object, ByVal e As IntarnetUdpLibrary.DeviceFinder.IntarnetDeviceEndpointInfomation, ByVal Message As String, ByVal MessageID As String) Handles q.ReciveSuccessReport
        Dim isMessage As Boolean = False

        For Each mf As frmMessage In Me.MdiChildren
            If mf.Text = "正在和" & e.ComputerName & "聊天" Then
                isMessage = True
                Dim lsi As New ListViewItem(e.ComputerName)
                lsi.SubItems.Add(Message)
                lsi.SubItems.Add(e.LocatTime)
                lsi.SubItems.Add(MessageID)
                lsi.SubItems.Add("该消息对方已经成功接收")
                mf.ListViewEx1.Items.Add(lsi)
                Me.ActivateMdiChild(mf)
                mf.WindowState = FormWindowState.Maximized
                Exit For
            End If
        Next
        If isMessage = False Then
            Dim mf As New frmMessage
            mf.Text = "正在和" & e.ComputerName & "聊天"
            mf.TextBoxX2.Text = e.ComputerName
            mf.TextBoxX3.Text = e.IPAddress
            mf.TextBoxX4.Text = e.LogonUser
            mf.TextBoxX5.Text = e.OSFullName
            mf.TextBoxX6.Text = e.TotalPhysicalMemory
            mf.MdiParent = Me
            mf.Show()

            Dim lsi As New ListViewItem(e.ComputerName)
            lsi.SubItems.Add(Message)
            lsi.SubItems.Add(e.LocatTime)
            lsi.SubItems.Add(MessageID)
            lsi.SubItems.Add("该消息对方已经成功接收")
            mf.ListViewEx1.Items.Add(lsi)
            mf.WindowState = FormWindowState.Maximized
        End If

    End Sub

    Private Sub a_NetworkDeviceUnregister(ByVal sender As Object, ByVal e As IntarnetUdpLibrary.DeviceFinder.IntarnetDeviceEndpointInfomation) Handles a.NetworkDeviceUnregister
        Dim ti As DevComponents.AdvTree.Node

        For Each mf As frmMessage In Me.MdiChildren
            If mf.Text = "正在和" & e.ComputerName & "聊天" Then
                mf.Close()
                Exit For
            End If
        Next

        For Each ti In Me.advRootNode.Nodes
            If ti.Nodes(0).Text = e.IPAddress Then
                ti.Remove()
                Exit For
            End If
        Next

    End Sub

    Private Sub ButtonItem15_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonItem15.Click
        Me.advRootNode.Nodes.Clear()
        q.QuestionIntranet()
    End Sub

    Private Sub ButtonItem16_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonItem16.Click
        Dim isMessage As Boolean = False
        If Me.advRootNode.Nodes.Count <> 0 And Me.AdvTree1.SelectedNode.TagString = "Device" Then
            Dim rep As IntarnetUdpLibrary.DeviceFinder.IntarnetDeviceEndpointInfomation
            With rep
                .ComputerName = Me.AdvTree1.SelectedNode.Text
                .IPAddress = Me.AdvTree1.SelectedNode.Nodes(0).Text
            End With
            a.SendMessage(rep, "shutdown")
        End If
    End Sub


    Private Sub ButtonItem17_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonItem17.Click
        Dim isMessage As Boolean = False
        If Me.advRootNode.Nodes.Count <> 0 And Me.AdvTree1.SelectedNode.TagString = "Device" Then
            Dim rep As IntarnetUdpLibrary.DeviceFinder.IntarnetDeviceEndpointInfomation
            With rep
                .ComputerName = Me.AdvTree1.SelectedNode.Text
                .IPAddress = Me.AdvTree1.SelectedNode.Nodes(0).Text
            End With
            a.SendMessage(rep, "restart")
        End If
    End Sub

    Private Sub ButtonItem18_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonItem18.Click
        Dim isMessage As Boolean = False
        If Me.advRootNode.Nodes.Count <> 0 And Me.AdvTree1.SelectedNode.TagString = "Device" Then
            Dim rep As IntarnetUdpLibrary.DeviceFinder.IntarnetDeviceEndpointInfomation
            With rep
                .ComputerName = Me.AdvTree1.SelectedNode.Text
                .IPAddress = Me.AdvTree1.SelectedNode.Nodes(0).Text
            End With
            a.SendMessage(rep, "logoff")
        End If
    End Sub
End Class

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VB.Net 是一种面向对象的编程语言,可用于实现 HTTP 服务器。通过使用 VB.Net 中提供的一些库和类,我们可以搭建一个简单的 HTTP 服务器。 首先,我们需要引用 System.Net 命名空间,以便能够使用其中的类和库。 接下来,我们可以创建一个 TcpListener 对象,用于侦听指定的 IP 地址和端口号上的 HTTP 请求。例如,我们可以使用以下代码创建一个 HTTP 服务器: Imports System.Net Imports System.Text Public Class HttpServer Public Shared Sub Main() Dim ipAddress As IPAddress = IPAddress.Parse("127.0.0.1") Dim port As Integer = 8080 Dim listener As New TcpListener(ipAddress, port) listener.Start() Console.WriteLine("HTTP Server started on {0}:{1}", ipAddress, port) While True Dim client As TcpClient = listener.AcceptTcpClient() Dim buffer(1024) As Byte Dim stream As NetworkStream = client.GetStream() Dim bytesRead As Integer = stream.Read(buffer, 0, buffer.Length) Dim request As String = Encoding.ASCII.GetString(buffer, 0, bytesRead) Dim response As String = "HTTP/1.1 200 OK" & vbCrLf & "Content-Type: text/html; charset=UTF-8" & vbCrLf & vbCrLf & "<html><body><h1>Hello, World!</h1></body></html>" Dim responseBytes As Byte() = Encoding.ASCII.GetBytes(response) stream.Write(responseBytes, 0, responseBytes.Length) client.Close() End While End Sub End Class 在以上代码中,我们创建了一个 TcpListener 对象,并使用给定的 IP 地址和端口号启动了服务器。然后,我们通过 AcceptTcpClient 方法来接受客户端连接。接着,我们读取客户端发送的请求,并返回一个简单的 "Hello, World!" 响应。 这只是一个简单的示例,你可以根据实际需求来扩展和改进 HTTP 服务器的功能。例如,你可以添加处理静态文件、处理不同 HTTP 方法、处理请求参数等的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值