spacepaste

  1.  
  2. #!/usr/bin/python
  3. import socket, select
  4. class ChatServer:
  5. def __init__( self, port ):
  6. self.port = port
  7. self.srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
  8. self.srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
  9. self.srvsock.bind( ('', port ) )
  10. self.srvsock.listen( 5 )
  11. self.descriptors = [ self.srvsock ]
  12. print 'ChatServer start on port %s' % port
  13. def run( self ):
  14. while 1:
  15. #await an event on a readable socket descriptor
  16. ( sread, swrite, sexec ) = select.select( self.descriptors, [], [] )
  17. #iterate through the tagged read descriptor
  18. for sock in sread:
  19. #received a connect to the server (listening) socket
  20. if sock == self.srvsock:
  21. self.accept_new_connection()
  22. else:
  23. #received something on a client socket
  24. str = sock.recv( 6042 )
  25. #check to see if the peer socket closed
  26. host, port = sock.getpeername()
  27. if str == '':
  28. print 'stopping [%s:%s]\r\n' % ( host, port )
  29. str = '\033[1;31mClient left %s:%s\033[1;m\r\n' % ( host, port )
  30. self.broadcast_string( str, sock )
  31. sock.close()
  32. self.descriptors.remove( sock )
  33. elif '\username' in str:
  34. self.set_username( str, sock, port )
  35. else:
  36. newstr = '\033[1;34m[user:%s] %s\033[1;m' % ( port, str )
  37. self.broadcast_string( newstr, sock )
  38. def broadcast_string( self, str, omit_sock ):
  39. for sock in self.descriptors:
  40. if sock != self.srvsock and sock != omit_sock:
  41. sock.send( str )
  42. print str
  43. def accept_new_connection( self ):
  44. newsock, ( remhost, remport ) = self.srvsock.accept()
  45. self.descriptors.append( newsock )
  46. newsock.send("\033[1;32mYou are now connected to the Poseidon chat server.\r\nPlease set a username by entering the syntax '\username ' followed by your chosen username.\033[1;m\r\n")
  47. str = '\033[1;33mClient joined %s:%s\033[1;m\r\n' % ( remhost, remport )
  48. self.broadcast_string( str, newsock )
  49. def set_username( self, str, sock, port ):
  50. username = str[ str.find(' ')+1: ]
  51. sock.append( {'username': username} )
  52. str = "[user:%s] now known as %s" % ( port, username )
  53. sock.send( str )
  54. self.broadcast_string( str )
  55. if __name__ == "__main__":
  56. myServer = ChatServer( 2626 ).run()
  57.