1
from socket import *
from time import ctime


HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
    print 'waiting for connection...'
    tcpCliSock, addr = tcpSerSock.accept()
    print "...connected from:", addr

    while True:
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        tcpCliSock.send("[%s] %s" % (ctime(), data))

    tcpCliSock.close()
tcpSerSock.close()

かなりのエラーがクリアされました。私は Core Python Application book に従っています。ループで何が起こるかを知る必要がありますか?

tcpCliSock, addr = tcpSerSock.accept() 

このコード行は正確に何をしますか? 「接続を待っていますか?」誰と、どのように?何かに接続するために指定された他のパラメーターはありません! この listen() はどのように機能しますか? プログラムを簡単に説明します。ありがとうございました

4

1 に答える 1

1

必要なものは、ドキュメントの Python Sockets HOWTO に記載されています。Python 2 バージョンは次のとおりです。

http://docs.python.org/2/howto/sockets.html

短いバージョンは、投稿したコードが、おそらく別のマシン上の別のプロセスからの要求に応答するように構成された単純なサーバーであり、データの小さなチャンクを送信することです。このサーバーは、タイムスタンプを前に付けてデータを送り返します。

socket.listen()着信接続を受信するためのソケットをセットアップするために使用されます。接続要求は短いキューに入り、順番に処理されます。 socket.accept()そのリッスン キューに着信接続があるかどうかを確認し、ある場合は、その 1 つの接続を処理するためだけに、他のマシンへの新しいソケットを開きます。接続が終了すると、最初のクライアントへの新しいソケットが閉じられ、サーバー ソケットがキュー内の次の接続に移動して処理されます。

このサーバーに何かをさせるには、クライアント プログラムを使用して正しいポートを開き、それにメッセージを送信する必要があります。この単純なものについてtelnetは、マシンにインストールされている場合は使用してみてください。このサーバーを実行してから、次を試してください。

telnet localhost 21567

同じマシンで、テキストの入力を開始します。応答が表示されるはずです。私の出力は次のようになりました:

$ telnet localhost 21567
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
j
[Sun Sep 15 11:58:27 2013] j
jkl
[Sun Sep 15 11:58:29 2013] jkl
fdjksla;
[Sun Sep 15 11:58:30 2013] fdjksla;
fdjkasl;fjdksal;fjkdsa;
[Sun Sep 15 11:58:32 2013] fdjkasl;fjdksal;fjkdsa;

注:HOSTこれを機能させるには、フィールドにホスト名を入力する必要があります。'localhost'それが役立つかどうか試してみてください。また、パラメータlocalhostとして使用するHOSTと、他のマシンからの接続を受信できなくなる可能性があると思います。その場合、ネットワーク上で独自のローカル ホスト名または IP アドレスを使用する必要があります。

'localhost'ここで説明したように、固定インデントとHOSTパラメーターを使用してOPを編集し、これtelnetが別のシェルで機能することをテストしました。

close()また、このコードがサーバー ソケットに到達しないことにも気付きました。サーバーを閉じて整然と終了したい場合breakは、外側のループのどこかに必要です。while

于 2013-09-15T18:51:00.143 に答える