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

在这里介绍程序主要实现的功能以及流程。
程序在启动后会开启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

处理连接的线程过程:


 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

定时器过程:

    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

界面:
这里写图片描述

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值