2017-08-04 12 views
0

それは私のクライアントです:Pythonソケット。 OSErrorの:[errnoが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

私は同じエラーを見つけたら、それはファイルオブジェクトのclose()からではなく、 "外側"からPythonファイルを閉じることによるものです。 – ggupta

+0

それは完全なエラー –

答えて

0

しかし、トレースバックに関連するコードにはいくつかの問題があります。ソケットは接続が閉じられると再利用できません。つまり、閉じたソケットでsocket.connect()を呼び出すことはできません。代わりに、毎回新しいソケットを作成する必要がないので、ループにソケット作成コードを移動:あなたが実際にデータグラム(UDPを使用するように意図されない限り、ストリームソケットにソケットオプションSO_BROADCASTを設定

import socket 

i=0 
while True: 
    conne = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    conne.connect(('127.0.0.1', 3001)) 
    ... 

には、それほど影響を与えています接続)、あなたはsetsockopt()への呼び出しを削除する必要があります。

他の少なくとも1つの問題は、クライアントがユーザーの名前を送信する前にサーバーが接続を閉じることです。おそらく、あなたのコードをデバッグしている間に見つかる他の問題があります。

+0

コードを改善するために何をお勧めしますか? –

+0

@Erop:既に提案されていることとは別に、あなたのコードをデバッグすることをお勧めします - いくつかのprint文などを追加してください。あなたのコードが何をすべきか分かりません。 – mhawke

-1

3001ポートがまだ開いていないか確認してください。

クライアントスクリプトで「while True:」と指定しました。無限ループで何度もサーバーに接続しようとしていますか?

+0

無限ループではなく、パケットを受信したときだけ真です。 – ggupta

関連する問題