ASP.NET VB Socket仅首次迭代正常,后续无法接收数据求助
问题分析与解决方案
你的代码存在几个核心问题,导致首次请求正常后后续无响应:
- Receive调用位置错误:仅在进入For循环时执行一次
clientSocket.Receive(Buffer),后续的While循环里没有重新读取Socket缓冲区的新数据,第一次读取后就反复处理旧的readByte值(如果首次读取后readByte变为0,就会一直循环但不触发任何逻辑)。 - 无限循环逻辑混乱:外层For循环通过强制设置
infinitecounter=1变成死循环,但没有在循环内重新监听新的连接或读取新数据;内层While(true)没有退出条件,也没有重新触发Receive操作。 - 未处理客户端断开场景:当
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
相关产品推荐
相关产品推荐

