Python socket与工作线程

1 投票
2 回答
1209 浏览
提问于 2025-04-18 01:59

我正在玩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
serverThread.daemon = True

守护线程在Python程序退出时会被突然停止。
可能是因为还没有调用listen()这个方法。

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.start() 后面加上 serverThread.join(),否则主线程会先结束,程序会在你的服务器线程启动之前就终止。

最后,你可能想要在线程内部修改 accept() 的调用,让它偶尔超时,这样可以正确处理 Ctrl+C 的中断(否则你只能通过强制结束程序来退出)。

撰写回答