Python socket与工作线程
我正在玩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 的中断(否则你只能通过强制结束程序来退出)。