SocketServer - multithreading

Jeremy Jones Jeremy.Jones at peregrine.com
Thu Oct 11 11:22:28 EDT 2001


I am trying to write a simple daemon that listens on a port and writes the
request that it receives to a file.  There will likely be multiple requests
coming in at the same time, so it needs to block the file writing so that
only one request writes to a file at once.  I "borrowed" a code example from
the web and hacked it a bit to try to do what I need  (and it almost works).
(If anyone sees that I am going about this in the wrong manner, please say
so.  I have had no experience with threading and almost no experience with
sockets.  Pointing me in another direction would be most welcome.)  Assuming
that SocketServer is a good way to handle this, here is what I have so far
(BTW - this is Python 1.5.2 on Linux):

"""
#! /usr/bin/python -O


import sys, SocketServer
import string

PORT = 2100


class RequestServer(SocketServer.ThreadingTCPServer):
   allow_reuse_address = 1


class RequestHandler(SocketServer.StreamRequestHandler):
   def handle(self):
      host, port = self.client_address
      #print "Connected by", host, port

      # get data
      request = ''

      while 1:
         line = self.rfile.readline()
         if line in (None, "\n", "\r\n"):
            break
         request = request + line

      self.server.request = request
      request = string.rstrip(request)
      print request

      #outfile = open("server.csv", 'w')
      #outfile.write(request)
      #outfile.close()
 

def main():
   # get port
   if len(sys.argv) > 1:
      port = int(eval(sys.argv[1]))
   else:
      port = PORT

   print "Waiting..."
   server = RequestServer(('', port), RequestHandler)
   #server.handle_request() # do not server forever - serve just 1 request
   server.serve_forever() # serve forever

main()
"""

The thing that isn't working is the file writing (thus it's commented out
right now).  With the 3 "outfile" lines commented out, this works fine.  But
when I uncomment them, the first request prints the request to STDOUT and to
the file, but subsequent requests only print to STDOUT.  The first and
subsequent requests apparently sit waiting on the socket:

[jjones at mahler socket]$ netstat -a | grep 2100
tcp        0      0 mahler.atlqa:2100       mahler.atlqa:3167
TIME_WAIT   
tcp        0      0 mahler.atlqa:2100       mahler.atlqa:3166
TIME_WAIT   
tcp        0      0 mahler.atlqa:2100       mahler.atlqa:3165
TIME_WAIT   
tcp        0      0 *:2100                  *:*                     LISTEN


If anyone has any ideas how I can get this working (or find another
solution), I would be most grateful.


Jeremy Jones




More information about the Python-list mailing list