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

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

+0

完全回溯错误请 –

+0

一旦我发现相同的错误,这是因为从“外部”关闭Python文件,即不是从文件对象的close(),您可能会检查相同。 – ggupta

+0

它的完整错误 –

但是,代码存在很多问题来解决与回溯有关的问题,一旦连接关闭,就不能重新使用套接字,即不能在关闭的套接字上调用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()的呼叫。

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

+0

你对改进代码有何建议? –

+0

@Erop:除了已经提出的建议,我建议你调试你的代码 - 添加一些打印语句等。我不知道你的代码应该做什么。 – mhawke

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

您在客户端脚本中给出'while True:'。你是否试图在无限循环中多次连接到服务器?

+0

它的无限循环,它只有当它只接收数据包时才会成立。 – ggupta