我正在尝试创建一个线程tcp流处理程序类线程和主线程谈话,但是Queue.Queue也没有做我需要它,服务器从另一个程序接收数据,我只想传递它进入主线程进行处理这里是我到目前为止的代码:
编辑:使用建议的答案更新,队列仍然没有做任何我甚至得不到任何打印命令工作后我做self.queue.put(info)就像整个事情死了。但是它没有给我任何错误,但是在我将信息放入队列之后,数据进入的流处理程序/线程就死了。class ThreadedTCPStreamHandler(SocketServer.StreamRequestHandler):
def __init__(self, request, client_address, server):
SocketServer.StreamRequestHandler.__init__(self, request, client_address, server)
self.queue = self.server.queue
def handle(self):
while True:
try:
self.data = self.rfile.readline().strip()
cur_thread = threading.current_thread()
command = self.data[0:2]
if command == "nr":
info = self.data[2:]
t1 = info.split("|")
title = t1[0]
self.queue.put(info)
class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True, queue=None):
self.queue = queue
SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass, bind_and_activate=bind_and_activate)
在主线程类中我有:
q = Queue.Queue()
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPStreamHandler, queue=q)
ip, port = server.server_address
server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = True
server_thread.start()
while True:
try:
item = q.get()
print item
q.task_done()
q.join()
except KeyboardInterrupt:
server.shutdown()
sys.exit(0)
然而没有什么是打印出来的,它不会传递数据,我知道我做错了什么,我只是不知道它是什么。如果有人有任何见解可以帮助我会非常感激,谢谢。
答案 0 :(得分:3)
流处理程序和主线程都需要使用相同的 Queue
对象才能工作。您在每个位置创建单独的队列对象。如果客户端和服务器代码都在同一个文件中,请使用queue
作为全局变量,或者执行以下操作:
class ThreadedTCPStreamServer(ThreadingMixin, TCPServer):
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True,
queue=None):
self.queue = queue
TCPServer.__init__(self, server_address, RequestHandlerClass,
bind_and_activate=bind_and_activate)
class ThreadedTCPStreamHandler(SocketServer.StreamRequestHandler):
def __init__(self, request, client_address, server):
self.queue = server.queue
StreamRequestHandler.__init__(self, request, client_address, server)
def handle(self):
while True:
self.data = self.rfile.readline().strip()
if not self.data:
break
cur_thread = threading.current_thread()
command = self.data[0:2]
if command == "nr":
info = self.data[2:]
t1 = info.split("|")
title = t1[0]
self.queue.put(info)
self.finish()
q = Queue.Queue()
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPStreamHandler, queue=q)
ip, port = server.server_address
server_thread = threading.Thread(target=server.serve_forever)
server_thread.daemon = True
server_thread.start()
while True:
try:
item = q.get()
print item
q.task_done()
q.join()
except KeyboardInterrupt:
server.shutdown()
sys.exit(0)
答案 1 :(得分:0)
发现我不得不从已接受的答案中调整一些内容。 此示例有效(至少在python2.7中有效)。
启动服务器后,您可以通过使用netcat或类似方法反复发送进行测试:
echo "nrtest" | nc -4 127.0.0.1 50514
在Linux上,也可以使用logger
命令进行发送,但是处理程序必须查找其他字符串(此示例根据pr OPs的要求检查该行以“ nr”开头)。
logger -T -n 127.0.0.1 -P 50514 "Test message"
结果如下-为便于阅读而分为几部分。
进口:
"""
Based on https://stackoverflow.com/a/25246157/2045924
"""
import threading
import Queue
import sys
import SocketServer
from SocketServer import StreamRequestHandler
from SocketServer import TCPServer
from SocketServer import ThreadingMixIn
将队列添加到TCPServer:
class ThreadedTCPStreamServer(ThreadingMixIn, TCPServer):
"""ThreadedTCPStreamServer."""
def __init__(self, server_address, RequestHandlerClass, bind_and_activate=True,
queue=None):
self.queue = queue
TCPServer.__init__(self, server_address, RequestHandlerClass,
bind_and_activate=bind_and_activate)
向StreamRequestHandler添加队列,告诉“处理”该做什么,然后让“完成”通过。
class ThreadedTCPStreamHandler(SocketServer.StreamRequestHandler):
"""ThreadedTCPStreamHandler."""
def __init__(self, request, client_address, server):
self.queue = server.queue
StreamRequestHandler.__init__(self, request, client_address, server)
def handle(self):
while True:
self.data = self.rfile.readline().strip()
if not self.data:
break
__cur_thread = threading.current_thread()
self.finish()
command = self.data[0:2]
if command == "nr":
info = self.data[2:]
__t1 = info.split("|")
__title = __t1[0]
self.queue.put(info)
self.finish()
def finish(self):
pass
定义全局变量并开始。
HOST = '127.0.0.1'
PORT = 50514
# QUEUE must be defined _outside_.
QUEUE = Queue.Queue()
QTIMEOUT = 1
# Setup instance of my own ThreadedTCPStreamServer with my own ThreadedTCPStreamHandler.
SERVER = ThreadedTCPStreamServer((HOST, PORT), ThreadedTCPStreamHandler, queue=QUEUE)
__IP, __PORT = SERVER.server_address
# Start the server
SERVER_THREAD = threading.Thread(target=SERVER.serve_forever)
SERVER_THREAD.daemon = True
SERVER_THREAD.start()
while True:
try:
#ITEM = QUEUE.get(block=True, timeout=QTIMEOUT)
ITEM = QUEUE.get()
print 'qsize({s}): {i}'.format(s=QUEUE.qsize(), i=ITEM)
QUEUE.task_done()
QUEUE.join()
except KeyboardInterrupt:
SERVER.shutdown()
sys.exit(0)
#except Queue.Empty:
# print 'Got Queue.Empty after waiting for {t}. Continuing...'.format(t=QTIMEOUT)
# continue
现在开始使用nc
或类似工具发送邮件。
要结束程序,请按<ctrl>+C
。
KeyboardInterrupt
将在发送数据包时“工作”。