私は自分自身にPythonのネットワークを教えています。私は自分自身にスレッドを教えていたときに、this pageを見つけたので、スクリプトをコピーし、Python 3.1.1のためにそれらを更新して実行しました。彼らは完璧に働いた。なぜホストは接続を中断していますか?
次に、私はいくつかの変更を行いました。私の目標は単純なことです:
- クライアントは整数をpickleしてサーバーに送信します。
- サーバーは、ピクルスされた整数を受信し、それをアンピクルし、倍にしてから、ピクルスしてクライアントに返します。
- クライアントは、ピクルされた(および倍増された)整数を受け取り、それをアンピクルして出力します。ここで
は、サーバーの:
import pickle
import socket
import threading
class ClientThread(threading.Thread):
def __init__(self, channel, details):
self.channel = channel
self.details = details
threading.Thread.__init__ (self)
def run(self):
print('Received connection:', self.details[0])
request = self.channel.recv(1024)
response = pickle.dumps(pickle.loads(request) * 2)
self.channel.send(response)
self.channel.close()
print('Closed connection:', self.details [ 0 ])
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 2727))
server.listen(5)
while True:
channel, details = server.accept()
ClientThread(channel, details).start()
そして、ここでクライアントです:
import pickle
import socket
import threading
class ConnectionThread(threading.Thread):
def run(self):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 2727))
for x in range(10):
client.send(pickle.dumps(x))
print('Sent:',str(x))
print('Received:',repr(pickle.loads(client.recv(1024))))
client.close()
for x in range(5):
ConnectionThread().start()
サーバが正常に動作し、私は、クライアントを実行すると、正常に接続し、整数の送信と受信を開始します彼らは期待どおりに倍増した。しかし、非常に速く例外を除きます:
Exception in thread Thread-2:
Traceback (most recent call last):
File "C:\Python30\lib\threading.py", line 507, in _bootstrap_inner
self.run()
File "C:\Users\Imagist\Desktop\server\client.py", line 13, in run
print('Received:',repr(pickle.loads(client.recv(1024))))
socket.error: [Errno 10053] An established connection was aborted by the softwar
e in your host machine
サーバーは動作し続けて接続は正常です。クライアントだけがクラッシュします。これは何の原因ですか?
EDIT:
import pickle
import socket
import threading
class ConnectionThread(threading.Thread):
def run(self):
for x in range(10):
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('localhost', 2727))
client.send(pickle.dumps(x))
print('Sent:',str(x))
print('Received:',repr(pickle.loads(client.recv(1024))))
client.close()
for x in range(5):
ConnectionThread().start()
しかし、私はまだ何が起こっているのか理解していない:私は、次のコードでの作業クライアントが得ました。これはちょうど開いてソケットの束を閉じていないのですか?それに時間的な制限はないはずです(ソケットを閉じた直後にソケットを開くことはできません)。
コードにいくつかの明らかなバグがあります。一方の側で1つのsendコールがもう一方の側で1つのrecvコールを引き起こすと思われます。これは真ではないかもしれません。TCPはストリームプロトコルです。しかし、どのようにエラーメッセージに関連するか分からない。 – leeeroy
@leeroy私は明らかにこれに新しいことがあるので、私は完全にここで批判に開放されています。あなたは、パケット指向ではなくストリームなので、私はTCPを使用すべきではないことを示唆しているようです。パケットを単にデータの非常に短いストリームとして表すことはできませんか?どのように使うべきかはわかりませんが、テストするためだけです。明らかに、私は単一の整数よりもはるかに多くのデータをプッシュするつもりです。 – Imagist
@leeroy(続き)私の目標は、Pythonでのみhttp://www.mcwalter.org/technology/java/httpd/tiny/index.htmlのようなものを実装することです。 – Imagist