2017-01-14 14 views
0

オプションを受け取り、メソッドを返す単純なサーバーを作成しようとしています。メソッド付きPythonソケット

だから私はいくつかの例のために見て、私はこの1つを見つけた:

def start_server(ip="0.0.0.0", port=8820): 
    sock = socket.socket() 
    sock.bind((ip, port)) 
    sock.listen(1) 
    print "Server started listening on %s:%d" % (ip, port) 

    return sock 


def new_client(sock): 
    c_sock, c_addr = sock.accept() 
    print "got new client %s" % c_addr 

    return c_sock, c_addr 

はどのようにして、開始サーバとクライアントの呼び出しを作成するのですか?

クライアントにオプションを送信し、サーバが終了するループでメソッド を返したい場合は、quitメソッドを呼び出します。例示的な方法のような

クライアントが押された場合は、 "名前":

def get_name(): 
    return "My name is Server!" 

感謝!

+0

あなたは 'socketserver' https://docs.python.org/2/library/socketserver.htmlを使用することができます(そして良い例があります) – rsm

+0

ありがとうございますしかし、それは私を助けませんwhile-Trueループ(クライアントまたはサーバー内)をどこに置くべきかを理解するために とメソッドの正しい呼び出し方法 –

+0

通常のWebサーバーを構築すれば、問題は少なくなります。 'フラスコ'、 'ボトル'、 'django'などを使うことができます。 – furas

答えて

0

ここでは、「エコー」サーバーを作成する簡単なサンプルを示します。 (それはちょうどそれがクライアントに戻って、クライアントから取得するすべてのデータを送信します。)

は、既存のコードの末尾にこれを追加します。我々は、単一のを許可するようにselectここで使用している:

import select 
def main(): 
    lsock = start_server() 
    rfds=[lsock] 
    while True: 
     readyfds, _, _ = select.select(rfds, [], []) 
     for fd in readyfds: 
      if fd == lsock: 
       csock, caddr = new_client(lsock) 
       rfds.append(csock) 
      else: 
       rdata = fd.recv(1024) 
       if rdata: 
        print("Got some data from client socket %s" % fd) 
        # Send data back to client 
        fd.send(rdata) 
       else: 
        print("Client socket closed %s" % fd) 
        rfds.remove(fd) 
        fd.close() 

main() 

注釈スレッドは一度に複数のファイル記述子を待つ。クライアントから接続要求が到着すると、リスニングソケットは「準備完了」状態になります。接続を受け入れ、選択リストの記述子のセットに新しいソケットを追加します。

他のソケットからデータを受信したときは、recvと呼び出します。それが成功すれば、同じデータをクライアントに送り返します(明らかに、実際のサーバーはデータでより有用なことをするでしょう)。 recvがゼロを返す場合、クライアントがソケットを閉じたことを意味します。したがって、選択リストからディスクリプタを削除します。

もう一つ:print "got new client %s" % c_addrの行のc_addrはタプル(アドレスとポート)なので、TypeError: not all arguments converted during string formattingのためにフォーマットが失敗します。簡単な修正はそれを作ることです:print "got new client %s" % str(c_addr)