Ich habe ein Client-Server-Socket-Python-Skript. Ich möchte den Zustand jeder Verbindung beibehalten, so dass ich feststellen kann, ob der Client seine erste Verbindung ist oder nicht. Ich schrieb erfolglos den folgenden Code:Python Statefull-Socket-Programmierung
`
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()
Jedes Mal, wenn der Client eine Verbindung erhalte ich ein leeres Kunden Dictionary. Scheint wie jedes Mal, wenn eine Verbindung ist Setup wird aufgerufen und leert das Wörterbuch clients
. Wie kann ich seinen Zustand bei jeder Verbindung halten?
Danke, das ist das, was ich brauche. Eine Frage. Wenn Sie den Server starten, müssen Sie ihn in einem Thread mit 'server_thread = threading.Thread (target = server.serve_forever) 'starten. Es reicht nicht aus, wie ich es starte: 'server = ThreadedTCPServer (('localhost', 60000), EchoRequestHandler) server.serve_forever()'? – curious
@curious Nein, das war nur so, dass die Clients und der Server alle in einem Python-Prozess laufen konnten. Wenn Sie separate Python-Skripts für den Server und den Client haben, ist dies nicht erforderlich. –