2017-04-30 11 views
0

ファイルを送信し、単一のポートを使用してlocalhostでファイルを受信しようとしています。 私はこのエラーが発生し続ける9:すべてを試しましたが、ファイル記述子が不良です!ここでエラー9:Pythonで単一のファイルを転送中にファイル記述子が正しくありません

は、ファイルがコードを送っている。ここで

import socket     # Import socket module 
port = 60000     # Reserve a port for your service. 
s = socket.socket()    # Create a socket object 
host = socket.gethostname()  # Get local machine name 
s.connect((host, port)) 
while True: 
    filename='mytext.txt' 
    f = open(filename,'rb') 
    l = f.read(1024) 
    while (l): 
     s.send(l) 
     print('Sent ',repr(l)) 
     l = f.read(1024) 
    f.close() 
print('Done sending') 
s.close() 

はファイルであるコードを受信:私が得る

import socket     # Import socket module 
s = socket.socket()    # Create a socket object 
host = socket.gethostname()  # Get local machine name 
port = 60000     # Reserve a port for your service. 
s.bind((host, port))   # Bind to the port 
s.listen(5)      # Now wait for client connection. 
print 'Listening....' 

with open('received_file', 'wb') as f: 
    print 'file opened' 

while True: 
    conn, addr = s.accept()  # Establish connection with client. 
    print 'Got connection from', addr 
    print('receiving data...') 
    data = conn.recv(1024) 
    print('data=%s', (data)) 
    if not data: 
     break 
    # write data to a file 
    f.write(data) 
f.close() 
print('Successfully get the file') 
print('connection closed') 

エラー:

('Sent ', "'Hello world!!!!!'") 
Done sending 
--------------------------------------------------------------------------- 
error          Traceback (most recent call last) 
<ipython-input-1-ef0f47f9369f> in <module>() 
    22  l = f.read(1024) 
    23  while (l): 
---> 24   s.send(l) 
    25   print('Sent ',repr(l)) 
    26   l = f.read(1024) 

C:\Users\Samir\Anaconda2\lib\socket.pyc in _dummy(*args) 
    172  __slots__ = [] 
    173  def _dummy(*args): 
--> 174   raise error(EBADF, 'Bad file descriptor') 
    175  # All _delegate_methods must also be initialized here. 
    176  send = recv = recv_into = sendto = recvfrom = recvfrom_into = 
_dummy 

error: [Errno 9] Bad file descriptor 

すべてのヘルプは歓迎です!

答えて

1

お客様のクライアントでは、内容を無期限に再送信しているため、外側のwhileループを削除してください。

それはちょうどかもしれない:入力データを読むとき、それがクラッシュするよう

with open('mytext.txt', 'rb') as f: 
    l = f.read(1024) 
    while l: 
     s.send(l) 
     print 'Sent ', repr(l) 
     l = f.read(1024) 

サーバーには、同様に、おそらくエラーの原因を問題があります。コンテキストマネージャを使用しているため、ファイルディスクリプタを開いてループの前に閉じています。

あなたはおそらく、クライアントが接続するたびに新しいファイルを作成する必要があります。

while True: 
    conn, addr = s.accept()  # Establish connection with client. 
    print 'Got connection from', addr 
    print 'receiving data...' 
    with open('received_file', 'wb') as f: 
     data = conn.recv(1024) 
     print 'data=%s', (data) 
     if not data: 
      break 
      # write data to a file 
     f.write(data) 

をそれはもちろん、単に同じファイルを上書きしますが、私はあなたがそれを把握することができます確信しています。

これは私の完全なコードではありませんが、機能します。 withステートメントを使用する場合、コードがブロックからどのように出ても自動的にファイルを閉じるコンテキストマネージャーを作成していることに注意してください。

あなたのサーバーはファイルの最初の1024バイトを読み込んでいますが、それを理解することができます。より大きなコンテンツを送信する予定の場合は、バッファサイズを最大64kbまで増やすことをお勧めします。

+0

ありがとうございます!私は何時間もこれを解決できませんでした!しかし、whileループを削除しないと、もはや接続待ちの状態になりませんか? – SamT01

+0

あなたもあなたのサーバーを修正することを確認してください! – Grimmy

+0

@ SamT01外部ループは、サーバーではなくクライアントで削除されました – Grimmy

関連する問題