关键词搜索

源码搜索 ×
×

用vb.net开发的简易服务器

发布2020-12-11浏览623次

详情内容

在这里介绍程序主要实现的功能以及流程。
程序在启动后会开启1个线程,1个定时器,一个线程用来接受来自客户端的连接,定时器用来检测当前有多少个客户连接,当有一个客户连接是,会开启一个线程用来与客户传送消息。为了简单起见,服务器发送消息为广播发送。

全局变量:

Dim listen_thread As Thread’监听线程
Dim listener As Socket '套接字
Public allDone As New ManualResetEvent(False)
Dim Thread_listen As Thread

Dim So As New ArrayList'已连接客户的集合
Dim thread_lock As Object = New Object()'用于线程锁
Dim Time As Timers.Time'定时器

    Public Class StateObject
    ’ Client socket.
    Public workSocket As Socket = Nothing
    ’ Size of receive buffer.
    Public Const BufferSize As Integer = 1024
    ’ Receive buffer.
    Public buffer(BufferSize) As Byte
    ’ Received data string.
    Public sb As New StringBuilder
    Public size As Int32
    End Class 'StateObject

    接受连接的线程过程;

    Public Sub listen_handle()
        TextBox3.AppendText(vbNewLine & "服务器启动")
        TextBox3.ScrollToCaret()
        While 1
    
            allDone.Reset()
            Try
                listener.BeginAccept(New AsyncCallback(AddressOf Accept_callback), listener)
            Catch e As Exception
                Exit Sub
            End Try
            allDone.WaitOne()
        End While
    End Sub
    
      4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    处理连接的线程vb.net教程过程:

    Public Sub Accept_callback(ar As IAsyncResult)
    allDone.Set() '让线程开始

        Dim waitDone As New ManualResetEvent(False)
        Dim socketi As Socket
    
        Try
            socketi = listener.EndAccept(ar)
        Catch ie As Exception
            Exit Sub
        End Try
        '显示出来
        TextBox3.AppendText(vbNewLine & "加入一个" & socketi.RemoteEndPoint.ToString)
        TextBox3.ScrollToCaret()
        Dim State As New StateObject()
        State.workSocket = socketi
        SyncLock thread_lock '/加入集合
            So.Add(socketi)
        End SyncLock
        State.size = 0
        Dim err As Int32 = 0
        While 1
            Try
                err = socketi.Receive(State.buffer)
            Catch e As Exception'接受异常说明客户端终止
                TextBox3.AppendText(vbNewLine & "客户端终止")
                TextBox3.ScrollToCaret()
                socketi.Close()
                SyncLock thread_lock
                    So.Remove(socketi)
                End SyncLock
                Exit Sub
            End Try
            If err > 0 Then '接收到消息并回调
                State.sb.Clear()
                State.sb.Append(Encoding.ASCII.GetString(State.buffer, 0, err))
                Dim str As String
                str = State.sb.ToString()
                TextBox1.AppendText(vbNewLine & str)
                TextBox1.ScrollToCaret()
            End If
        End While
    End Sub
    
      4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    定时器过程:

    Public Sub Time_hande()
        Dim str As String = ""
        SyncLock thread_lock '
            For Each member As Socket In So
                str = str & member.RemoteEndPoint.ToString() & vbNewLine
            Next
        End SyncLock
        TextBox6.Text = str
    End Sub
    
      4
    • 5
    • 6
    • 7
    • 8
    • 9

    界面:
    这里写图片描述
    在这里插入图片描述

    github:https://github.com/fengasdf/WindowsApplication4/blob/master/WindowsApplication4/Form1.vb

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载