繁体   English   中英

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

[英]Python sockets. OSError: [Errno 9] Bad file descriptor

是我的客户:

#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()

这是我的服务器:

#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()
))

启动Client.py之后,出现以下错误:

追溯(最近一次通话最近):conne.connect中的文件“ client.py”,第10行(('127.0.0.1',3001))OSError:[Errno 9]错误的文件描述符

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

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

import socket

i=0
while True:
    conne = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    conne.connect(('127.0.0.1', 3001))
    ...

在流套接字上设置套接字选项SO_BROADCAST不会产生任何影响,除非您实际上打算使用数据报(UDP连接),否则应删除对setsockopt()的调用。

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

检查3001端口是否仍然打开。

您已经在客户端脚本中给出了“ while True:”。 您是否试图以无限循环多次连接到服务器?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM