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

Python Socket通信循环无法持续运行且退出报OS error98问题求助

问题原因

  • 命令大小写不匹配:服务端判断的接收命令是Data,你输入小写data无法命中逻辑,进入空else分支后无响应
  • 客户端单次连接仅发送一次命令就主动关闭socket,没有在同一会话内持续处理用户输入
  • 服务端收到Quit命令退出连接处理逻辑后,旧端口处于TIME_WAIT状态,重新绑定相同端口就会触发OS error98地址占用错误
  • 服务端没有处理客户端断开连接的场景,recv返回空值时会进入死循环空转

服务端修改方案

添加端口复用参数,统一命令大小写校验,增加空数据判断,修改后代码如下:

import socket
import numpy as np

HOST = '192.168.1.65'  
PORT = 65432        

def random_data():
    x1 = np.random.randint(0, 55, None)
    y1 = np.random.randint(0, 45, None)
    return "{},{}".format(x1,y1)

def my_server():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        # 开启端口复用,解决地址占用问题
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        print("Server Started waiting for client to connect ")
        s.bind((HOST, PORT))
        s.listen(5)
        conn, addr = s.accept()
        with conn:
            print('Connected by', addr)
            while True:
                data = conn.recv(1024).decode('utf-8')
                # 空数据说明客户端断开连接,退出循环等待新连接
                if not data:
                    break
                # 统一转大写,兼容大小写输入
                cmd = data.strip().upper()
                if cmd == "DATA":
                    print("Ok Sending data ")
                    my_data = random_data()
                    conn.sendall(my_data.encode('utf-8'))
                elif cmd == "QUIT":
                    print("shutting down current connection ")
                    break
                else:
                    conn.sendall(b"Invalid command, use DATA or QUIT")

if __name__ == '__main__':
    while 1:
        my_server()

客户端修改方案

去掉冗余的定时器和外层死循环,在同一次连接内持续接收用户输入,修改后代码如下:

import socket

HOST = '192.168.1.65'
PORT = 65432       

def process_data_from_server(x):
    x1, y1 = x.split(",")
    return x1,y1

def my_client():
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        print("Connected to server, input DATA to get data, QUIT to exit")
        while True:
            my = input("Enter command: ").strip()
            s.sendall(my.encode('utf-8'))
            data = s.recv(1024).decode('utf-8')
            if my.upper() == "QUIT":
                print("Disconnecting...")
                break
            if "," in data:
                x_temperature,y_humidity = process_data_from_server(data)
                print("Temperature {}".format(x_temperature))
                print("Humidity {}".format(y_humidity))
            else:
                print("Server response:", data)
        s.close()

if __name__ == "__main__":
    my_client()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:06:03