[英]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.