Python套接字。 OSERROR:[错误9]错误的文件描述符
这是我的客户:Python套接字。 OSERROR:[错误9]错误的文件描述符
#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后,我得到这个错误:
Traceback (most recent call last): File "client.py", line 10, in conne.connect (('127.0.0.1', 3001)) OSError: [Errno 9] Bad file descriptor
问题将在第一次输入后立即创建。 这个程序 - 聊天。服务器正在等待消息。客户正在发送。
但是,代码存在很多问题来解决与回溯有关的问题,一旦连接关闭,就不能重新使用套接字,即不能在关闭的套接字上调用socket.connect()
。相反,你需要创建一个新的socket每一次,所以插座创建代码移动到循环:
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()
的呼叫。
至少还有一个问题是服务器在客户端向用户发送用户名之前关闭连接。在调试代码时可能会遇到其他问题。
你对改进代码有何建议? –
@Erop:除了已经提出的建议,我建议你调试你的代码 - 添加一些打印语句等。我不知道你的代码应该做什么。 – mhawke
完全回溯错误请 –
一旦我发现相同的错误,这是因为从“外部”关闭Python文件,即不是从文件对象的close(),您可能会检查相同。 – ggupta
它的完整错误 –