2017-08-04 228 views
0

這是我的客戶: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

它的完整錯誤 –

回答

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

-1

檢查3001端口是否仍然打開。

您在客戶端腳本中給出'while True:'。你是否試圖在無限循環中多次連接到服務器?

+0

它的無限循環,它只有當它只接收數據包時纔會成立。 – ggupta

相關問題