Beginning Python - From Novice to Professional
Beginning Python - From Novice to Professional Beginning Python - From Novice to Professional
CHAPTER 24 ■ PROJECT 5: A VIRTUAL TEA PARTY 467 and the user dilbert connected to the server using the command telnet localhost 5005 Figure 24-1. A sample chat session Listing 24-6. A Slightly More Complicated Chat Server (chatserver.py) from asyncore import dispatcher from asynchat import async_chat import socket, asyncore PORT = 5005 NAME = 'TestChat' class EndSession(Exception): pass class CommandHandler: """ Simple command handler similar to cmd.Cmd from the standard library. """
468 CHAPTER 24 ■ PROJECT 5: A VIRTUAL TEA PARTY def unknown(self, session, cmd): 'Respond to an unknown command' session.push('Unknown command: %s\r\n' % cmd) def handle(self, session, line): 'Handle a received line from a given session' if not line.strip(): return # Split off the command: parts = line.split(' ', 1) cmd = parts[0] try: line = parts[1].strip() except IndexError: line = '' # Try to find a handler: meth = getattr(self, 'do_'+cmd, None) # If it is callable... if callable(meth): # ...call it: meth(session, line) else: # Otherwise, respond to the unknown command: self.unknown(session, cmd) class Room(CommandHandler): """ A generic environment that may contain one or more users (sessions). It takes care of basic command handling and broadcasting. """ def __init__(self, server): self.server = server self.sessions = [] def add(self, session): 'A session (user) has entered the room' self.sessions.append(session) def remove(self, session): 'A session (user) has left the room' self.sessions.remove(session) def broadcast(self, line): 'Send a line to all sessions in the room' for session in self.sessions: session.push(line)
- Page 448 and 449: CHAPTER 21 ■ PROJECT 2: PAINTING
- Page 450 and 451: CHAPTER 21 ■ PROJECT 2: PAINTING
- Page 452 and 453: CHAPTER 22 ■ ■ ■ Project 3: X
- Page 454 and 455: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 456 and 457: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 458 and 459: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 460 and 461: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 462 and 463: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 464 and 465: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 466 and 467: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 468: CHAPTER 22 ■ PROJECT 3: XML FOR A
- Page 471 and 472: 440 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 473 and 474: 442 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 475 and 476: 444 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 477 and 478: 446 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 479 and 480: 448 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 481 and 482: 450 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 483 and 484: 452 CHAPTER 23 ■ PROJECT 4: IN TH
- Page 486 and 487: CHAPTER 24 ■ ■ ■ Project 5: A
- Page 488 and 489: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 490 and 491: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 492 and 493: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 494 and 495: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 496 and 497: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 500 and 501: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 502 and 503: CHAPTER 24 ■ PROJECT 5: A VIRTUAL
- Page 504 and 505: CHAPTER 25 ■ ■ ■ Project 6: R
- Page 506 and 507: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 508 and 509: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 510 and 511: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 512: CHAPTER 25 ■ PROJECT 6: REMOTE ED
- Page 515 and 516: 484 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 517 and 518: 486 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 519 and 520: 488 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 521 and 522: 490 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 523 and 524: 492 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 525 and 526: 494 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 527 and 528: 496 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 529 and 530: 498 CHAPTER 26 ■ PROJECT 7: YOUR
- Page 531 and 532: 500 CHAPTER 27 ■ PROJECT 8: FILE
- Page 533 and 534: 502 CHAPTER 27 ■ PROJECT 8: FILE
- Page 535 and 536: 504 CHAPTER 27 ■ PROJECT 8: FILE
- Page 537 and 538: 506 CHAPTER 27 ■ PROJECT 8: FILE
- Page 539 and 540: 508 CHAPTER 27 ■ PROJECT 8: FILE
- Page 541 and 542: 510 CHAPTER 27 ■ PROJECT 8: FILE
- Page 543 and 544: 512 CHAPTER 27 ■ PROJECT 8: FILE
- Page 545 and 546: 514 CHAPTER 27 ■ PROJECT 8: FILE
- Page 547 and 548: 516 CHAPTER 27 ■ PROJECT 8: FILE
468 CHAPTER 24 ■ PROJECT 5: A VIRTUAL TEA PARTY<br />
def unknown(self, session, cmd):<br />
'Respond <strong>to</strong> an unknown command'<br />
session.push('Unknown command: %s\r\n' % cmd)<br />
def handle(self, session, line):<br />
'Handle a received line from a given session'<br />
if not line.strip(): return<br />
# Split off the command:<br />
parts = line.split(' ', 1)<br />
cmd = parts[0]<br />
try: line = parts[1].strip()<br />
except IndexError: line = ''<br />
# Try <strong>to</strong> find a handler:<br />
meth = getattr(self, 'do_'+cmd, None)<br />
# If it is callable...<br />
if callable(meth):<br />
# ...call it:<br />
meth(session, line)<br />
else:<br />
# Otherwise, respond <strong>to</strong> the unknown command:<br />
self.unknown(session, cmd)<br />
class Room(CommandHandler):<br />
"""<br />
A generic environment that may contain one or more users<br />
(sessions). It takes care of basic command handling and<br />
broadcasting.<br />
"""<br />
def __init__(self, server):<br />
self.server = server<br />
self.sessions = []<br />
def add(self, session):<br />
'A session (user) has entered the room'<br />
self.sessions.append(session)<br />
def remove(self, session):<br />
'A session (user) has left the room'<br />
self.sessions.remove(session)<br />
def broadcast(self, line):<br />
'Send a line <strong>to</strong> all sessions in the room'<br />
for session in self.sessions:<br />
session.push(line)