python socket编程 - 如何使用下面的代码实现多线程?

时间:2013-02-17 17:16:23

标签: python sockets

这是一个简单的服务器。当您打开浏览器类型到服务器的地址时,它将响应状态代码和所请求的html的内容。

#import socket module
from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)

#Prepare a sever socket
serverSocket.bind((socket.gethostname(), 4501))#Fill in start
serverSocket.listen(5)#Fill in end

while True:
    #Establish the connection
    print 'Ready to serve...'
    connectionSocket, addr = serverSocket.accept()#Accepts a TCP client connection, waiting until connection arrives
    print 'Required connection', addr
    try:

        message = connectionSocket.recv(32)#Fill in start #Fill in end
        filename = message.split()[1]
        f = open(filename[1:])
        outputdata = f.read()#Fill in start #Fill in end

        #Send one HTTP header line into socket
        connectionSocket.send('HTTP/1.0 200 OK\r\n\r\n')#Fill in start


        #Send the content of the requested file to the client

        for i in range(0, len(outputdata)):
            connectionSocket.send(outputdata[i])

        connectionSocket.close() 

    except IOError:
        #Send response message for file not found
        connectionSocket.send('404 Not Found')#Fill in start
        #Fill in end

        #Close client socket
        connectionSocket.close()#Fill in start
        serverSocket.close()#Fill in end

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点。这是一种使用工作线程池的方法:

import Queue
import threading

num_workers = 10
work_q = Queue.Queue()

def worker(work_q):
    while True:
        connection_socket = work_q.get()
        if connection_socket is None:
            break

        try:
            message = connectionSocket.recv()
            filename = message.split()[1]
            f = open(filename[1:])
            outputdata = f.read()
            connectionSocket.send('HTTP/1.0 200 OK\r\n\r\n')
            connectionSocket.send(outputdata)
        except IOError:
            connectionSocket.send('404 Not Found')
        finally:
            connectionSocket.close()

workers = []
for i in range(num_workers):
    t = threading.Thread(target=worker, args=(work_q,))
    t.start()
    workers.append(t)

while True:
    #Establish the connection
    print 'Ready to serve...'
    connectionSocket, addr = serverSocket.accept()
    print 'Required connection', addr
    work_q.put(connectionSocket)