1

对不起,如果这个问题太基本了——这是我第一次尝试在 Python 中使用多线程套接字。

基本上,我正在尝试编写代码来获取 UDPServer 套接字接收的数据;套接字本身在线程内部运行。为了使主线程可以访问数据,我正在使用线程本地存储(根据我阅读的所有内容,这似乎是正确的方法). 下面的代码是我第一次尝试使它工作,但变量似乎没有正确更新。对可能发生的事情有任何想法吗?

编辑:请参阅下面的工作示例

服务器:

import socket
import threading
import SocketServer

data = threading.local()

class UDPHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        data.outputString = self.request[0].strip()

class ThreadedUDPServer(SocketServer.ThreadingMixIn, SocketServer.UDPServer):

    def __init__(self, serverAddress, handlerClass):
        SocketServer.UDPServer.__init__(self, serverAddress, handlerClass)
        data.outputString = ""

if __name__ == "__main__":

    ReceiverSocket = ThreadedUDPServer(("localhost",11111), UDPHandler)
    ServerThread = threading.Thread(target=ReceiverSocket.serve_forever)
    ServerThread.daemon = True
    ServerThread.start()

    while 1:
        if data.outputString:
            print data.outputString
            data.outputString = ""

客户:

import socket
import sys

HOST, PORT = "localhost", 11111
data = " ".join(sys.argv[1:])

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.sendto(data + "\n", (HOST, PORT))

谢谢!!

4

2 回答 2

3

让它工作。是的 - 本地线程与此无关...... :)

我已经设置了一个全局变量,并在每个修改它的函数中将其定义为全局变量(根据这个非常有用的答案

import socket
import threading
import SocketServer

data = ""

class UDPHandler(SocketServer.BaseRequestHandler):

    def handle(self):
        global data
        data = self.request[0].strip()

class ThreadedUDPServer(SocketServer.ThreadingMixIn, SocketServer.UDPServer):
    pass

if __name__ == "__main__":

    ReceiverSocket = ThreadedUDPServer(("localhost",11111), UDPHandler)
    ServerThread = threading.Thread(target=ReceiverSocket.serve_forever)
    ServerThread.start()

    while 1:
        if data:
            print data
            data = ""
于 2013-02-13T05:16:55.367 回答
1

尝试使用全局变量,但确保在每个线程和函数中将其定义为全局变量

于 2013-08-10T23:32:42.447 回答