2016-08-18 1 views
0

私はクライアントサーバーソケットのpythonスクリプトを持っています。クライアントの最初の接続であるかどうかを識別できるように、各接続の状態を保持したい。Pythonステートフルソケットプログラミング

`

import socket,sys,SocketServer 
from threading import Thread 


class EchoRequestHandler(SocketServer.BaseRequestHandler): 

    def setup(self): 
     self.clients = {} 
     print self.client_address, 'connected!' 
     self.request.send('hi ' + str(self.client_address) + '\n') 


    def setup(self): 
     print self.client_address, 'connected!' 
     self.request.send('hi ' + str(self.client_address) + '\n') 

def getFile(self): 
     fle = self.request.makefile('r') 
     filename = fle.readline() 
     print("Got filename {}\n".format(filename)) 
     data = 'fnord' # just something to be there for the first comparison 
     with open(filename[:-1], 'w') as outfile: 
      while data: 
       #data = self.request.recv(1024) 
       data = fle.read() 
       #print('writing {!r} to file ....'.format(data)) 
       outfile.write(data) 
       print("Finish {}\n".format(filename)) 
     print("finish handle") 
def handle(self): 
    addr = self.client_address[0] 
    print(self.clients) 
    if addr not in self.clients: 
     print("firsttime") 
     self.clients[addr]=1 
     print(self.clients) 
    self.getFile() 

def finish(self): 
    print self.client_address, 'disconnected!' 
    #self.request.send('bye ' + str(self.client_address) + '\n') 

class ThreadedTCPServer(SocketServer.ThreadingMixIn, 
SocketServer.TCPServer): 
    pass 
if __name__=='__main__': 
     #server = SocketServer.ThreadingTCPServer(('localhost', 50000), EchoRequestHandler) 
     server = ThreadedTCPServer(('localhost', 60000), EchoRequestHandler) 
     server.serve_forever() 

たびに、クライアントは、私は空のクライアントが辞書取得しています接続:私は失敗し、次のコードを書きました。接続設定が呼び出され、辞書が空になるたびに、clientsのように見えます。どのように私は各接続でその状態を維持することができますか?

答えて

1

スレッドソケットサーバーは、接続ごとにEchoRequestHandlerの新しいインスタンスを作成します。そのため、そのクラスインスタンスにクライアントを格納することは正しくありません。

各リクエストハンドラインスタンスには、そのサーバを知っているself.serverメンバがあります。そのため、代わりにそこに格納することができます。以下は

は、モジュールのヘルプにはPython 2.7 SocketServerの例から変更されます。

#!python2 
import time 
import socket 
import threading 
import SocketServer 

class ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): 

    def handle(self): 
     self.server.clients.add(self.client_address) 
     print 'connected from',self.client_address 
     print 'all clients =',self.server.clients 
     data = self.request.recv(1024) 
     cur_thread = threading.current_thread() 
     response = "{}: {}".format(cur_thread.name, data) 
     self.request.sendall(response) 
     time.sleep(2) 
     print 'disconnected' 

class ThreadedTCPServer(SocketServer.ThreadingTCPServer): 
    def __init__(self,*args,**kwargs): 
     SocketServer.ThreadingTCPServer.__init__(self,*args,**kwargs) 
     self.clients = set() 

def client(ip, port, message): 
    sock = socket.socket() 
    sock.connect((ip, port)) 
    try: 
     sock.sendall(message) 
     response = sock.recv(1024) 
     print "Received: {}".format(response) 
    finally: 
     sock.close() 

if __name__ == "__main__": 
    # Port 0 means to select an arbitrary unused port 
    HOST, PORT = "localhost", 0 

    server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) 
    ip, port = server.server_address 

    # Start a thread with the server -- that thread will then start one 
    # more thread for each request 
    server_thread = threading.Thread(target=server.serve_forever) 
    # Exit the server thread when the main thread terminates 
    server_thread.daemon = True 
    server_thread.start() 
    print "Server loop running in thread:", server_thread.name 

    client(ip, port, "Hello World 1\n") 
    client(ip, port, "Hello World 2\n") 
    client(ip, port, "Hello World 3\n") 

    server.shutdown() 
    server.server_close() 

出力:

Server loop running in thread: Thread-1 
connected from ('127.0.0.1', 2360) 
all clients = set([('127.0.0.1', 2360)]) 
Received: Thread-2: Hello World 1 

connected from ('127.0.0.1', 2361) 
all clients = set([('127.0.0.1', 2361), ('127.0.0.1', 2360)]) 
Received: Thread-3: Hello World 2 

connected from ('127.0.0.1', 2362) 
all clients = set([('127.0.0.1', 2361), ('127.0.0.1', 2362), ('127.0.0.1', 2360)]) 
Received: Thread-4: Hello World 3 

disconnected 
disconnected 
disconnected 
+0

おかげで、それは私が必要とするものです。一つの質問。サーバを起動するときには、 'server_thread = threading.Thread(target = server.serve_forever)'でスレッド内で起動する必要があります。 'server = ThreadedTCPServer(( 'localhost'、60000)、EchoRequestHandler)server.serve_forever()'これは私が起動する方法では十分ではありません。 – curious

+1

@curiousいいえ、それはクライアントとサーバーがすべて1つのPythonプロセスで実行できるようになったことだけです。サーバーとクライアント用に別々のPythonスクリプトがある場合、それは必要ありません。 –