Updated chat server example to be resilient against broken pipes. Also used a set instead of a list and parameterized the port.

This commit is contained in:
Ryan Williams
2010-03-31 13:14:04 -07:00
parent 737e2e71ae
commit 2d0dc9a269

View File

@@ -1,27 +1,35 @@
import eventlet import eventlet
from eventlet.green import socket
participants = [] PORT=3001
participants = set()
def read_chat_forever(writer, reader): def read_chat_forever(writer, reader):
line = reader.readline() line = reader.readline()
while line: while line:
print "Chat:", line.strip() print "Chat:", line.strip()
for p in participants: for p in participants:
if p is not writer: # Don't echo try:
p.write(line) if p is not writer: # Don't echo
p.flush() p.write(line)
p.flush()
except socket.error, e:
# ignore broken pipes, they just mean the participant
# closed its connection already
if e[0] != 32:
raise
line = reader.readline() line = reader.readline()
participants.remove(writer) participants.remove(writer)
print "Participant left chat." print "Participant left chat."
try: try:
print "ChatServer starting up on port 3000" print "ChatServer starting up on port %s" % PORT
server = eventlet.listen(('0.0.0.0', 3000)) server = eventlet.listen(('0.0.0.0', PORT))
while True: while True:
new_connection, address = server.accept() new_connection, address = server.accept()
print "Participant joined chat." print "Participant joined chat."
new_writer = new_connection.makefile('w') new_writer = new_connection.makefile('w')
participants.append(new_writer) participants.add(new_writer)
eventlet.spawn_n(read_chat_forever, eventlet.spawn_n(read_chat_forever,
new_writer, new_writer,
new_connection.makefile('r')) new_connection.makefile('r'))