与工作线程的Python套接字

时间:2014-04-09 07:32:25

标签: python multithreading sockets

我正在使用Python来理解客户端 - 服务器和线程编程的基础知识。

这是我的main.py应用程序:

from threading import Thread 
from Server import Server


    class Worker(object):

        def __init__(self, clients):
            #constructor
            self.clients = clients

        def start(self):
            while True:
                print("it work as expected!")
                conn, addr = self.clients.get()
                print( conn.recv(1024) )

    #create a instance of the server
    server = Server()

    #put on a new thread 
    def serverThreadCallback(server):
        server.start()

    def createWorkerCallback():
        worker = Worker(server.getClients())
        worker.start()


    #put the server on a new thread
    serverThread = Thread( target=serverThreadCallback, args=(server, )  )
    serverThread.daemon = True
    serverThread.start()

    '''
    workerThread = Thread(target=createWorkerCallback) 
    workerThread.daemon = True
    workerThread.start()
    '''

这是我的server.py

import socket
import queue


class Server(object):
    '''
    classdocs
    '''
    def __init__(self):
        '''
        Constructor
        '''
        self.clients = queue.Queue() 

    def create(self):
        print("Creating server...")
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR , 1)
        self.socket = server

    def listen(self):
        print("Starting server...")
        self.socket.bind( ("0.0.0.0", 9002) )
        self.socket.listen(10)
        print("Server started. Listening on localhost port 9002")
        while(True): 
            #conn, addr = self.server.accept()
            self.clients.put(self.socket.accept())

    def start(self):
        self.create()
        self.listen()

    def getClients(self):
        return self.clients

当我尝试在该线程中启动服务器时,监听方法 不打电话。服务器的create()方法中存在某些东西。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

首先,您发布的编码存在一些语法错误:

main.py:

1)class声明开始缩进是错误的

2)您应该致电from server import Server(请注意模块名称为server - 小写)

server.py

3)您应致电import Queue(而不是import queue

4)因此,对self.clients = queue.Queue()的调用应为self.clients = Queue.Queue()(模块名称为Queue,大写为Q

除此之外,您必须在serverThread.join()之后添加serverThread.start(),否则主线程结束,程序在您的服务器线程有机会启动之前终止。

最后,你可能想要在线程中更改对accept()的调用,以便它不时地超时以正确处理Ctrl + C中断(否则你只能通过杀死它来完成你的程序)

答案 1 :(得分:0)

serverThread.daemon = True

当Python程序退出时,守护程序线程突然停止 也许listen()方法还没有被调用。