TCPListener如何异步接收数据

做服务端千万别用线程保持连接,到了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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值