ich habe mich vorhin an Threads und nicht blockierende Sockets gewagt und komme nicht mehr weiter.
Ziel ist, dass ich einen Echo-Server habe, der mit mehreren Clienten gleichzeitig klarkommt....
Ich habe eine Klasse für den Server. Die macht nicht viel, außer einen Serversocket aufzumachen und auf Connections zu warten. Bei einer neuen Verbindung wir ein "Handler-Thread" erzeugt und der soll sich um die Kundschaft kümmern.
Der Handler wird auch erzeugt und funktioniert soweit auch wie erwartet. Nur funktioniert es nicht, dass der Server sich um mehrere Clients gleichzeitig kümmert. Die neuen Verbindungen werden so lange auf Halde gelegt, bis die momentan aktuelle Verbindung beendet ist.
Also habe ich ein setblocking(0) für den erzeugten Client-Socket in den Code geschrieben, aber wenn ich versuche zum Server eine Verbindung aufzubauen bekomme ich folgenden Fehler:
Traceback (most recent call last):
File "/home/x/workspace/tES/src/main.py", line 3, in ?
echo = echoServer.echoServer()
File "/home/x/workspace/tES/src/echoServer.py", line 33, in __init__
curHandler = handler.handler(curClientSocket, curClientAddr)
File "/home/x/workspace/tES/src/handler.py", line 11, in __init__
self.handle()
File "/home/x/workspace/tES/src/handler.py", line 18, in handle
except self.socket.error:
AttributeError: '_socketobject' object has no attribute 'error'
Wie muss ich denn den Code umbauen, damit ich den multithreaded Echo-Server hinbekomme?
Vielen Dank für Tipps!
Code: Alles auswählen
### server.py ###
import socket as sk
import handler
class echoServer(object):
IP = "localhost"
PORT = 8080
BOUND = False
def __init__(self):
self.socket = sk.socket(sk.AF_INET, sk.SOCK_STREAM)
# first bind to socket
while not self.BOUND:
try:
self.socket.bind((self.IP, self.PORT))
self.BOUND = True
self.tell("Bound to port "+str(self.PORT))
except sk.error:
self.PORT = self.PORT + 1
self.tell("Can't bind, trying next port " + str(self.PORT))
# now we're bound, run server loop
if self.BOUND:
while True:
self.tell("Listening")
self.socket.listen(5)
(curClientSocket, curClientAddr) = self.socket.accept()
# spawn new Handler thread
curHandler = handler.handler(curClientSocket, curClientAddr)
curHandler.start()
else:
self.tell("Error, exiting!")
def tell(self, text):
print "Server:",text
### handler.py ###
from threading import Thread
class handler(Thread):
BUFLEN = 1024
def __init__(self, socket, addr):
Thread.__init__(self)
self.socket = socket
self.addr = addr
self.tell("Socket for Client " + str(self.addr[0]) + ":" + str(self.addr[1])+ " created")
self.handle()
def handle(self):
while True:
#self.socket.setblocking(0) <------------- PROBLEM!
data = self.socket.recv(self.BUFLEN)
if not data:
self.tell("Connection to host closed")
break
elif data == "QUIT\r\n":
self.tell("Closing connection")
break
else:
self.tell(data)
self.socket.send(">"+data)
self.socket.close()
def tell(self, text):
print "Handler:",text