簡體   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