做服务端千万别用线程保持连接,到了3000以上就各种连接异常了,下面这种异步接收方法完美解决,保存个上万连接不成问题,对于单独的socket,onbody是顺序执行的,包不会错位,完整测试实例可以自己下,
VB源码,C#可以参考
完整测试示例
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim ip = IPAddress.Parse("0.0.0.0")
listener = New TcpListener(ip, CInt(1253))
listener.Start()
listener.BeginAcceptSocket(AddressOf 获取接入连接, Nothing)
End Sub
Dim index As Integer = 0
Private Sub 获取接入连接(ar As IAsyncResult)
Dim clientSocket = listener.EndAcceptSocket(ar)
listener.BeginAcceptTcpClient(AddressOf 获取接入连接, Nothing)
log("接入连接:" & clientSocket.RemoteEndPoint.ToString)
Dim clientSocketInfo As New ClientSocketInfo
clientSocketInfo.clientSocket = clientSocket
clients.Add(clientSocketInfo)
开始异步接收数据(clientSocket)
End Sub
Private Sub 开始异步接收数据(clientSocket As Socket)
Dim Buffer(4095) As Byte
clientSocket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, SocketError.Success,
Sub(ar1 As IAsyncResult)
Dim receLen As Integer = 0
receLen = clientSocket.EndReceive(ar1, SocketError.Success)
If receLen > 0 Then
onbody(ar1.AsyncState, receLen)
开始异步接收数据(clientSocket)
Else
log("读取到0字节")
For i As Integer = 0 To clients.Count - 1
If clients(i).clientSocket Is clientSocket Then
clientSocket.Disconnect(False)
clientSocket.Dispose()
clients.RemoveAt(i)
End If
Next
End If
Dim j2 = 1
End Sub, Buffer)
End Sub
Private Sub onbody(buff() As Byte, buffLength As Integer)
If 是否暂停 Then
Wait_1.WaitOne()
End If
'nowlength += buffLength
'DCM_ThreadControl.Thread_ProgressBar_Value(nowlength / filelength * 100, ProgressBar1)
End Sub