我正在使用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()方法中存在某些东西。
我做错了什么?
答案 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()
方法还没有被调用。