4

私は、ネットワーク プログラミングがどのようにうまく行われるかを理解するために、Python ソケットをいじっています。現在、サーバーに接続し、閉じる前に任意の数のメッセージを送信できるクライアントをセットアップしようとしています。私はまだすべてを完全に理解しているわけではなく、1 つのメッセージしか送信できません。ソケットプログラミングの経験がある人にとっては、おそらく明らかなことです。複数のメッセージを送信する方法を誰かに説明してもらえますか? connect、bind、close、recv、およびすべての主要なソケット機能がどのように機能するかを説明する適切な情報源を提供してください。(私が見つけたほとんどのソースは、それらをいつ使用するかを教えてくれます。)

クライアント

# !usr/bin/python

import socket
import sys


def main():
    host = ""
    port = 8934
    message = "Hello World!"

    host = raw_input("Enter IP: ")
    #Create Socket
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    except socket.error, msg:
        print "Failed to create socket. Error code: %s Error Message: %s"%(str(msg[0]),msg[1])
        sys.exit()
    print "Socket created"

    #Connect to server
    s.connect((host,port))

    while message != "/e":
        #Send Data
        message = raw_input("Send >> ")
        try:
            s.sendall(message)
        except socket.error, msg:
            print "ERROR %s"%(msg[1])
            print "Failed to send."
        s.close()

if __name__ == "__main__":
    main()

サーバ

# !usr/bin/python

import socket
import sys

HOST = ""
PORT = 8934
s = socket.socket()

class BoServer:


    def __init__(self):
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        except socket.error,msg:
            print "Unable to create socket"
            sys.exit()
        print "Socket created."
    def bind(self):
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        try:
            s.bind((HOST,PORT))
        except socket.error,msg:
            print "Bind failed. Closing..."
            sys.exit()
        print "Socket bound."
    def run(self):
        while True:
            s.listen(10)
            print "Socket Listening"
            conn, addr = s.accept()
            print "Connected to %s:%s"%(addr[0],addr[1])
            income = conn.recv(4096)
            if income != "":
                print income

def main():
    serv = BoServer()
    serv.bind()
    serv.run()

if __name__ == "__main__":
    main()
4

1 に答える 1

6

クライアント側では、ループ内のソケットを閉じているwhile True:ため、ループの今後の反復でこれ以上メッセージを送信することはできません。異なる接続で各メッセージを送信する場合は、ループ内にソケットを作成する必要があります。同じ接続で複数のメッセージを送信する場合は、クローズコールをループの外に移動する必要があります。

サーバー側では、ループの反復ごとに1回listen()を実行しますが、これは不要です。その目的は、バッファリングされた着信接続のキューの長さを設定することであるため、1回だけ呼び出す必要があります。また、別の着信接続を受け入れるループの2回目の反復に進む前に、ソケットからの単一の読み取りのみを実行しています。

サーバーの動作に応じて、別の潜在的な問題は、一度に1つの着信接続のみを処理していることです。長時間実行される接続を処理する場合は、これが問題になる可能性があります。複数の接続を一度に処理するには、各接続を独自のスレッドで処理するか(たとえば、標準ライブラリモジュールThreadingTCPServerのクラスを使用して)、 Twistedなどの非同期IOフレームワークを使用することをお勧めします。SocketServer

于 2012-12-10T00:14:26.673 に答える