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
 | 
			
		||||
from eventlet.green import socket
 | 
			
		||||
 | 
			
		||||
participants = []
 | 
			
		||||
PORT=3001
 | 
			
		||||
participants = set()
 | 
			
		||||
 | 
			
		||||
def read_chat_forever(writer, reader):
 | 
			
		||||
    line = reader.readline()
 | 
			
		||||
    while line:
 | 
			
		||||
        print "Chat:", line.strip()
 | 
			
		||||
        for p in participants:
 | 
			
		||||
            if p is not writer: # Don't echo
 | 
			
		||||
                p.write(line)
 | 
			
		||||
                p.flush()
 | 
			
		||||
            try:
 | 
			
		||||
                if p is not writer: # Don't echo
 | 
			
		||||
                    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()
 | 
			
		||||
    participants.remove(writer)
 | 
			
		||||
    print "Participant left chat."
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    print "ChatServer starting up on port 3000"
 | 
			
		||||
    server = eventlet.listen(('0.0.0.0', 3000))
 | 
			
		||||
    print "ChatServer starting up on port %s" % PORT
 | 
			
		||||
    server = eventlet.listen(('0.0.0.0', PORT))
 | 
			
		||||
    while True:
 | 
			
		||||
        new_connection, address = server.accept()
 | 
			
		||||
        print "Participant joined chat."
 | 
			
		||||
        new_writer = new_connection.makefile('w')
 | 
			
		||||
        participants.append(new_writer)
 | 
			
		||||
        participants.add(new_writer)
 | 
			
		||||
        eventlet.spawn_n(read_chat_forever, 
 | 
			
		||||
                         new_writer, 
 | 
			
		||||
                         new_connection.makefile('r'))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user