title: How to implement non blocking socket server in python
body: <p>A similar but different question:</p>
  
  <p>I have an IRC client that generates strings. This IRC client uses a hook to call a method (somone_said) whenever someone says something. I want to send this string over a socket to my flash client.</p>
  
  <p>I have a working client in flash and a server in python but the problem is that it blocks:
  1) while listening for the client connection
  2) while waiting for the next message to be generated</p>
  
  <p>This stops the IRC client from responding to other inputs.</p>
  
  <p>I think I need to create my socket in a separate thread but this creates three more problems.
  1) how does my someone_said event driven method access the socket
  2) What if someone says something when there is no server client connection (while listening) or if the client has closed the connection.
  3) How to check if the thread is alive and if not to open a new one?</p>
  
  <p>My blocking server code is this:</p>
  
  <pre><code># Echo server program
  import socket
  import sys
  
  HOST = None               # Symbolic name meaning all available interfaces
  PORT = 7001              # Arbitrary non-privileged port
  s = None
  
  def startListening():
      print "starting to listen"
  
      for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                                    socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
          af, socktype, proto, canonname, sa = res
          try:
              s = socket.socket(af, socktype, proto)
          except socket.error as msg:
              s = None
              continue
          try:
              s.bind(sa)
              s.listen(1)
          except socket.error as msg:
              s.close()
              s = None
              continue
          break
      if s is None:
          print 'could not open socket'
          sys.exit(1)
      conn, addr = s.accept()
      print 'Connected by', addr
      while 1:
          try: 
              data = conn.recv(1024)
          except:
              print "cannot recieve data"
              break
          if not data: 
              break
          print data
          message = ""
          while not "quit" in message:
              message = raw_input('Say Something : ') # This will come from event driven method
              try: 
                  conn.sendall(message)
              except Exception as exc:
                  print "message could not be sent"
                  break
  
  
      conn.close()
      print "connection closed"
  
  while 1:
      startListening()
  </code></pre>
  
  <p>The xchat module python script works  like this (requires HexChat to run)</p>
  
  <pre><code>__module_name__ = "Forward Module"
  __module_version__ = "1.0.0"
  __module_description__ = "Forward To Flash Module by Xcom"
  
  import sys
  import xchat
  
  def someone_said(word, word_eol, userdata):
      # method called whenever someone speaks in IRC channel
      username = str(word[0]) # From IRC contains the username string
      message = str(word[1]) # From IRC contains the user message
      sendString = username + " : " + message
      send_to_server(sendString)
  
  
  def send_to_server(message):
      # send over socket method to be implemented here
  
  xchat.hook_print('Channel Message' , someone_said)
  </code></pre>
  
  <p>I've been banging my head against this wall for days now. Help me obi wan kenobi, you're my only hope.</p>