You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET VB Socket仅首次迭代正常,后续无法接收数据求助

问题分析与解决方案

你的代码存在几个核心问题,导致首次请求正常后后续无响应:

  1. Receive调用位置错误:仅在进入For循环时执行一次clientSocket.Receive(Buffer),后续的While循环里没有重新读取Socket缓冲区的新数据,第一次读取后就反复处理旧的readByte值(如果首次读取后readByte变为0,就会一直循环但不触发任何逻辑)。
  2. 无限循环逻辑混乱:外层For循环通过强制设置infinitecounter=1变成死循环,但没有在循环内重新监听新的连接或读取新数据;内层While(true)没有退出条件,也没有重新触发Receive操作。
  3. 未处理客户端断开场景:当readByte=0时,说明客户端已关闭连接,此时需要重新调用listenerSocket.Accept()等待新的连接,而不是继续空循环。

修正后的代码

Dim listenerSocket As Socket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Dim ipend As IPEndPoint = New IPEndPoint(IPAddress.Parse("127.0.0.1"), 8888)

listenerSocket.Bind(ipend)
listenerSocket.Listen(10) ' 设置合理的监听队列长度,0表示无限制但不推荐

Console.WriteLine("Waiting for connection : ")

While True ' 用外层死循环持续等待新连接
    Dim clientSocket As Socket = listenerSocket.Accept() ' 每次Accept新的客户端连接
    Dim Buffer As Byte() = New Byte(clientSocket.SendBufferSize - 1) {}
    Dim readByte As Integer
    Dim SAPrq As String, SAPpar As String, SAPnwk As String
    Dim xy As Object ' 根据实际类型调整

    Console.WriteLine("Client connected!")

    While True ' 处理当前客户端的所有请求
        readByte = clientSocket.Receive(Buffer)
        If readByte = 0 Then
            ' 客户端断开连接,退出内层循环,回到外层等待新连接
            Console.WriteLine("Client disconnected!")
            clientSocket.Close()
            Exit While
        End If

        ' 处理接收到的数据
        Dim rData As Byte() = New Byte(readByte - 1) {}
        Array.Copy(Buffer, rData, readByte)
        SAPrq = System.Text.Encoding.UTF8.GetString(rData)
        SAPpar = Left(SAPrq, 1)

        If SAPpar = "1" Then ' 注意这里要比较字符串,原代码存在类型不匹配问题
            SAPnwk = Mid(SAPrq, 3)
            xy = Getbam(SAPnwk) ' 调用SAP交互函数
        End If
    End While
End While

关键修改说明

  • 调整循环结构:外层死循环负责持续监听新的客户端连接,内层循环处理单个客户端的所有请求,确保每次新连接都能被正确接收。
  • 移动Receive位置:将clientSocket.Receive(Buffer)放到内层循环中,每次循环都尝试读取新的Socket数据,保证能响应后续请求。
  • 处理客户端断开:当readByte=0时,关闭当前客户端Socket并退出内层循环,回到外层等待新的连接。
  • 修正类型匹配问题:原代码中SAPpar = Left(SAPrq, 1)得到的是字符串,直接和Integer类型的1比较会导致逻辑错误,改为比较字符串"1"。
  • 合理设置监听队列:Listen(10)设置合理的监听队列长度,避免因连接过多导致拒绝新请求。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:50:23