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