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:
@@ -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'))
|
||||||
|
Reference in New Issue
Block a user