VB.NET 客户端每IP限制一个连接的简单示意代码

Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

Public Class Ly连接
    Public 连接线程 As Thread
    Public 连接 As Socket

    Public Sub 关闭连接()
        Try
            '关闭Socket,并且结束线程(必须先关Socket再结束线程,否则出错)
            连接.Dispose()
            连接.Close()
            连接线程.Abort()
        Catch
        End Try
    End Sub

End Class

Public Class Ly客户连接
    Inherits Ly连接
    Public ip As String

End Class

Public Class Ly连接池
    Protected 最大侦听数 As Int32 = 1000
    Protected 最大连接数 As Int32 = 100
    Protected 索引 As New Dictionary(Of String, Ly客户连接)

    Protected 侦听连接 As New Ly连接


    Dim data As String = String.Empty

    Public Function 开始侦听(本地ip As String, 端口号 As String) As Boolean
        Dim 侦听IP端口 As New IPEndPoint(Net.IPAddress.Parse(本地ip), 端口号)
        '初始化Socket为IP4的版本 TCP协议
        With 侦听连接
            .连接 = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            '绑定端口
            .连接.Bind(侦听IP端口)
            '最大侦听客户端数
            .连接.Listen(最大侦听数)
            '创建一个线程并且启动线程开始连接口
            .连接线程 = New Thread(AddressOf 侦听)
            '设置为后台进程
            .连接线程.IsBackground = True
            '给线程传输一个参数,类型为Socket
            .连接线程.Start(.连接)
        End With

        Return True
    End Function

    Public Sub 关闭侦听()
        Try
            侦听连接.关闭连接()
        Catch
        End Try
    End Sub

    Public Sub 关闭所有客户连接()
        Try
            For Each 客户 In 索引.Values
                客户.关闭连接()
            Next

        Catch
        End Try
    End Sub

    Private Sub 侦听(ByVal 侦听连接 As Socket)
        While True
            Try
                处理连接请求(侦听连接.Accept()) '等待接收客户端的连接
            Catch
            End Try
        End While

    End Sub

    Public Sub 处理连接请求(ByVal 请求连接 As Socket)
        If Me.索引.Count >= Me.最大连接数 Then
            Return
        End If

        Dim ip = 请求连接.RemoteEndPoint.ToString
        If Me.索引.ContainsKey(ip) Then
            Return
        End If

        '创建一个线程用于接收客户端数据
        Dim 连接线程 = New Thread(AddressOf 接收数据)
        Dim 新客户 As New Ly客户连接
        新客户.连接 = 请求连接
        新客户.连接线程 = 连接线程
        新客户.ip = ip

        '设置为后台进程
        连接线程.IsBackground = True
        连接线程.Start(新客户)

        索引.Add(ip, 新客户)
    End Sub

    Private Sub 接收数据(ByVal 客户 As Ly客户连接)
        While True
            '处理客户数据
        End While
    End Sub
End Class

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值