ich möchte einen einfachen Frage/Antwort Server schreiben auf dem sich clients über feste sockets anmelden können.
Das funktioniert mit dem asyncore service/dispatcher modell ganz gut, ich erstelle einen asyncore dispatcher der die einzelnen "service" als Tochterklasse von asynchat erstellt, die dann auf Nachrichten der jeweiligen Clients reagieren.
D.h. durch überladen der Methoden "found_terminator(self):" und "self.push(self,data):) kann ich wunderbar Daten empfangen bzw. senden.
Im wesentlichen läuft das so ab dass wenn eine Nachricht reinkommt der Server dem jeweiligen Client eine Antwort schickt.
Nun würde ich aber gern, wenn ein Client z.B. eine neue Textzeile in einem Chat schickt, diese nicht nur dem derzeitigen Chat-Array "appenden" sondern auch die anderen clients, die sich per "Listen to Chat" gemeldet haben, über die neue Nachricht informieren.
Ich hatte erst gedacht, ich erstelle eine globale Liste "ChatListeners" und alle Clients die sich zum Chat-listenening anmelden wird dann weitergeleitet.
Code zum registrieren:
Code: Alles auswählen
elif data.startswith('Get chats'):
self.newPush(''.join(['JSON:Chat:',
json.dumps(chatList, separators=(',',':'))]))
#register this instance as a listener for new chat messages
chatListeners.append(self);
Code: Alles auswählen
for service in chatListeners:
service.newPush(newMsg)
Code: Alles auswählen
error: uncaptured python exception, closing channel <__main__.Service
connected 85.178.233.245:15886 at 0x7fc1ad9a6200>
(<class 'socket.error'>:(9, 'Bad file descriptor') [/usr/lib/python2.5
/asynchat.py|initiate_send|219] [/usr/lib/python2.5/asyncore.py|send|331]
[/usr/lib/python2.5/socket.py|_dummy|146])
Wie würde ich das denn jetzt in Python machen? Vielen Dank für Hilfe![/code]
EDIT: Bevor jemand sich wundert, die methode newPush ist einfach eine Überladung der Methode Push damit der Client bestimmen kann wann eine Nachricht zu ende ist:
Code: Alles auswählen
class Service(asynchat.async_chat):
def __init__(self, server, sock):
asynchat.async_chat.__init__(self, sock)
self.set_terminator('\r\n')
self.data = ''
def collect_incoming_data(self, data):
print "Current data :",self.data
self.data = self.data + data
def newPush(self, data):
self.push(''.join( [data,'\r\n']))
#....