Python 套接字。OSError: [Errno 9] 错误的文件描述符

Yeh*_*nko 1 python sockets

这是我的客户:

#CLIENT
import socket
conne = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conne.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
i=0
while True:
    conne.connect ( ('127.0.0.1', 3001) )
    if i==0:
        conne.send(b"test")
        i+=1
    data = conne.recv(1024)
    #print(data)
    if data.decode("utf-8")=="0":
        name = input("Write your name:\n")
        conne.send(bytes(name, "utf-8"))
    else:
        text = input("Write text:\n")
        conne.send(bytes(text, "utf-8"))
    conne.close()
Run Code Online (Sandbox Code Playgroud)

这是我的服务器:

#SERVER

import socket

counter=0
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 3001))
sock.listen(10)

while True:
    conn, addr = sock.accept()
    data = conn.recv(1024)
    if len(data.decode("utf-8"))>0:
        if counter==0:
            conn.send(b"0")
            counter+=1
        else:
            conn.send(b"1")
            counter+=1
    else:
        break
        print("Zero")
        conn.send("Slava")
    conn.close()
))
Run Code Online (Sandbox Code Playgroud)

启动 Client.py 后,我收到此错误:

回溯(最近一次调用):文件“client.py”,第 10 行,在 conne.connect ( ('127.0.0.1', 3001) ) OSError: [Errno 9] Bad file descriptor

问题将在第一次输入后立即创建。这个程序 - 聊天。服务器正在等待消息。客户端正在发送。

mha*_*wke 6

代码有很多问题,但是,为了解决与回溯相关的问题,一旦连接关闭,套接字就不能重用,即您不能调用socket.connect()已关闭的套接字。相反,您每次都需要创建一个新的套接字,因此将套接字创建代码移动到循环中:

import socket

i=0
while True:
    conne = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    conne.connect(('127.0.0.1', 3001))
    ...
Run Code Online (Sandbox Code Playgroud)

SO_BROADCAST在流套接字上设置套接字选项没有任何影响,除非您确实打算使用数据报(UDP 连接),否则您应该删除对setsockopt().

至少还有一个问题是服务器在客户端将用户名发送给它之前关闭了连接。在调试代码时,您可能会发现其他问题。