Python将异步tcp服务器作为模块导入:数据交换不起作用,多线程处理模块

2024-09-27 00:11:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行以下项目:我创建了一个异步tcp-tcp-ip客户机/服务器连接。客户机(c#wpfgui)将消息写入服务器(Raspberry pi,Python)并等待传感器数据。服务器接收来自客户机的消息,并以循环方式发回当前传感器数据。在

独立的服务器/客户机应用程序运行良好。在下一步中,我希望使用Python中的模块。以下是我希望在单独的Python文件中实现的主要部分:

主.py

  • 启动异步tcp服务器并在后台运行(线程)

  • 打印从客户端接收的数据

  • 读取传感器数据(线程)
  • 评估(可选)
  • 将传感器数据移交给异步服务器

下面是python中的代码,我有这样的方法(启动异步tcp服务器):

主.py

import thread
import logging
import socket
import asyncore
#Import async server
from AsyncServerPi_Test import Server


if __name__=='__main__':

    logging.basicConfig(level=logging.DEBUG,format='%(name)s: %(message)s',)
    log = logging.getLogger('main')
    #parameter
    ip = socket.gethostname() 
    port = 12345
    address = (ip, port) # port 0 means the kernel gives port 
    dataFromPi= 'SensorData'
    server = Server(address,dataFromPi) #issue with parameter dataFromPI
    #dataFromClient = server.getDataFromClient() Code is not working!
    #log.debug(dataFromGUI)
asyncore.loop(timeout=1) # checks all client's readable/writable every second 

异步服务器PI_测试.py

^{pr2}$

我对参数dataFromPi和dataFromClient有一些问题。dataFromPi是我移交服务器实例的输入参数(server=server(address,dataFromPi))。当我执行主.py文件:

error: uncaptured python exception, closing channel <AsyncServerPi_Test.Handler connected 192.168.0.108:51028 at 0x31ba7d8> (<type 'exceptions.NameError'>:global name 'dataFromPi' is not defined [C:\Python27\lib\asyncore.py|write|91] [C:\Python27\lib\asyncore.py|handle_write_event|468] [C:\Python27\lib\AsyncServerPi_Test.py|handle_write|75])
Handler('192.168.0.108', 12345): handle_close()

我检查了异步服务器pi中dataFromPi的移交_测试.py但我找不到解决办法。在

下一个问题是我无法在主.py文件。在AsyncServerPi中_测试.py文件我可以从客户端读取数据(handle_read)。我试图在handle_read中返回接收到的数据,但我认为数据的返回必须发生在server()类中。如何归档服务器类从客户机返回数据,以便打印接收到的数据main.py?在

此外,服务器应该在后台运行,这样我可以并行运行其他操作(从超声波读取传感器数据,评估…)。作为一个例子,我希望主.py应该看起来像这样:

import thread
import logging
import socket
import asyncore
#Import US
import Ultrasonic
#Import async tcp ip server
from AsyncServerPi_Test import Server

def main():
    #Logging
    logging.basicConfig(level=logging.DEBUG,format='%(name)s: %(message)s',)
    log = logging.getLogger('main')
    #Parameter for server
    ip = socket.gethostname() 
    port = 12345
    address = (ip, port) # port 0 means the kernel gives port 
    ultrasonicTest = Ultrasonic() # run in a seperate thread?
    dataFromSensor = ultrasonicTest.readSensorData
    serverTest = Server(address,dataFromSensor) # run in a seperate thread?
    dataFromClient = serverTest.receivedData()
asyncore.loop(timeout=1) # checks all client's readable/writable every second 

if __name__=='__main__':
    main()

在这方面,我有以下问题:

  • 服务器实例(serverTest=server(address,dataFromSensor))必须在单独的线程中运行?在
  • 为传感器创建新的线程(ultrasonicTest=Ultrasonic()):

  • 在模块中运行线程是否更好(例如,在超声波.py而不是在主.py)

  • 同步线程?

我对python比较陌生,在多线程方面我没有太多的经验。如果有人用python做过一些类似的项目,并能给我一些提示或类似项目的参考,那会很有帮助。在


Tags: 数据pyimportip服务器servermainport

热门问题