Python socket.error: [Errno 111] 接続が拒否されました 質問する

Python socket.error: [Errno 111] 接続が拒否されました 質問する

ソケットを使用してファイル転送を行うプログラムを書こうとしています。コードのサーバー側は正常に動作しています。しかし、クライアント側では次のエラーが発生します。

Traceback (most recent call last):
File "client.py", line 54, in <module>
uploadFiles(directory)
File "client.py", line 36, in uploadFiles
transferFile(fname)
File "client.py", line 13, in transferFile     
cs.connect((HOST, 36258))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused

私のコードは次のとおりです

import os
import socket

def transferFile(fname):
   HOST = '127.0.0.1'
   CPORT = 36258
   MPORT = 36250
   FILE = fname
   cs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   cs.connect((HOST, 36258))
   cs.send("SEND " + FILE)
   cs.close()
   ms = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   ms.connect((HOST, MPORT))
   f = open(FILE, "rb")
   data = f.read()
   f.close()
   ms.send(data)
   ms.close()

def uploadFiles(directory):
   home = os.getenv("HOME")
   folder = str(home + "/" + directory)
   os.chdir(folder)
   dirList = os.listdir(folder)
   print dirList
   for fname in dirList:
       if fname.endswith('.bin'):
           transferFile(fname)

os.chdir(os.getenv("HOME"))
directory = "testdownload"
if not os.path.exists(directory):
   os.makedirs(directory)
 os.chdir(directory)

uploadFiles(directory)

GoogleやStack Overflowの投稿で助けを探してみましたが、どれも役に立ちませんでした。誰か助けてくれませんか?コードの一部だけを貼り付けたので、行番号が異なる可能性があります。

ベストアンサー1

問題は明らかに (あなたが理解したように)、接続しようとしたときにサーバー側でポート 36250 が開いていなかった (そのため接続が拒否された) ことです。サーバーはSEND別の接続でコマンドを受け取った後にこのソケットを開くはずだったのですが、どうやら「クライアント側と同期して開いていなかった」ようです。

まあ、主な理由は、同期がまったくなかったということでしょう。呼び出し:

cs.send("SEND " + FILE)
cs.close()

データをOSのバッファに置くだけで、closeおそらくデータをフラッシュしてネットワークにプッシュしますが、データがサーバーに到達する前に戻ってくることはほぼ確実です。afterを追加するとsleep問題closeは軽減されるかもしれませんが、これは同期ではない

正しい解決策は確認するサーバーが接続を開始しました。この場合、サーバーから何らかのメッセージ (たとえば、接続先を示すOKなど) が返される必要があります。これにより、サーバーがすでにリッスンしていることが保証されます。PORT 36250

もう一つは戻り値を確認する必要がありますsendバッファから何バイトが取得されたか確認するには、sendall

(回答が遅くなってご迷惑をおかけして申し訳ありませんが、これはよく寄せられる質問だと思い、コメント欄の「睡眠」というアイデアがあまり気に入りませんでした。)

おすすめ記事