Python 通过在单独线程上创建的套接字发送数据

Python 通过在单独线程上创建的套接字发送数据,python,Python,我正在为我正在制作的气象站编写一些软件。该软件在raspberry pi上运行,使用Python的套接字功能通过网络将收集的数据发送给其他计算机。但是,我在多线程方面遇到了问题 主代码在无限循环中运行,以在每分钟开始时保存数据,但它还必须管理从客户端到设备的连接,独立于数据收集。收集数据后,需要将其发送到连接的客户端 我已经将管理客户端连接的代码(使用socket.accept())放在一个单独的线程中,但是为了向那些连接的客户端发送消息,我需要访问该线程并检索包含客户端的连接变量。这显然是不可

我正在为我正在制作的气象站编写一些软件。该软件在raspberry pi上运行,使用Python的套接字功能通过网络将收集的数据发送给其他计算机。但是,我在多线程方面遇到了问题

主代码在无限循环中运行,以在每分钟开始时保存数据,但它还必须管理从客户端到设备的连接,独立于数据收集。收集数据后,需要将其发送到连接的客户端

我已经将管理客户端连接的代码(使用
socket.accept()
)放在一个单独的线程中,但是为了向那些连接的客户端发送消息,我需要访问该线程并检索包含客户端的
连接
变量。这显然是不可能的

通常对于这样的问题,我会创建一个全局变量,并将
连接的内容复制到其中,这样我就可以从任何地方访问它,但我不知道它的类型,因此无法声明该变量

下面是我的代码

import serial
import socket
import threading
import time
import datetime
import os

dataFilePath = "/home/pi/Weather_Station/stationData.xml"

# Open serial communications port to arduino
weatherStation = serial.Serial("/dev/ttyACM0", 9600);

print("STATUS: station software initialised on " + datetime
     .datetime.now().strftime("%A %d of %B %Y at %H:%M:%S"))

# Create data logging file if doesn't exist
if os.path.isfile(dataFilePath) == False:

   dataFileA = open(dataFilePath, "w")
   dataFileA.write(
       "<?xml version=\"1.0\" encoding=\"utf-8\"?><stationData></stationData>")
   dataFileA.close()

   # Output data file creation timestamp
   print("STATUS: data logging file created on " + datetime
         .datetime.now().strftime("%A %d of %B %Y at %H:%M:%S"))


# Allow devices to connect to station for data retrieval
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# Bind to IP address and listen for connections
server.bind(("192.168.0.31", 8888))
server.listen(10)


# Accept clients on separate thread
def my_tcp_server():
   connection, address = server.accept()

   print("STATUS: ip " + connection
         .recv(1024) + " connected to station")
   connection.sendall("connection successful")

# Run a seperate thread to allow accepting clients individually from recording data
threading.Thread(target=my_tcp_server).start()

print("STATUS: available for network access on " + datetime
     .datetime.now().strftime("%A %d of %B %Y at %H:%M:%S"))


while True:

   # Constanly read port to prevent buffer build up
   weatherStation.readline()

   # Log data at begining of every minute
   if datetime.datetime.now().strftime("%S") == "00":

       report = weatherStation.readline().replace("\r\n", "")
       timestamp = datetime.datetime.now(
           ).strftime("%Y-%m-%dT%H:%M:%S")

       finalReport = "<report time=\"" + timestamp + "\" " + report

       # Send data to all connected clients
       connection.sendall(finalReport.encode())

       with open(dataFilePath, "rb+") as dataFileB:
           dataFileB.seek(-14, os.SEEK_END)
           dataFileB.truncate()

           # Record data to file
           dataFileB.write(finalReport)
           dataFileB.write("</stationData>")

       print(finalReport)
导入序列号
导入套接字
导入线程
导入时间
导入日期时间
导入操作系统
dataFilePath=“/home/pi/Weather\u Station/stationData.xml”
#打开arduino的串行通信端口
weatherStation=serial.serial(“/dev/ttyACM0”,9600);
打印(“状态:站点软件在”+datetime上初始化
.datetime.now().strftime(“%A%d,共%B%Y,位于%H:%M:%S”))
#如果不存在,则创建数据日志文件
如果os.path.isfile(dataFilePath)==False:
dataFileA=打开(dataFilePath,“w”)
dataFileA.write(
"")
dataFileA.close()
#输出数据文件创建时间戳
打印(“状态:在”+日期时间创建的数据记录文件
.datetime.now().strftime(“%A%d,共%B%Y,位于%H:%M:%S”))
#允许设备连接到工作站以进行数据检索
服务器=socket.socket(socket.AF\u INET,socket.SOCK\u流)
server.setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
#绑定到IP地址并侦听连接
server.bind((((“192.168.0.31”,8888))
服务器。听(10)
#在单独的线程上接受客户端
定义my_tcp_服务器():
连接,地址=server.accept()
打印(“状态:ip”+连接
.recv(1024)+“连接到站点”)
connection.sendall(“连接成功”)
#运行一个单独的线程,允许从记录数据中单独接受客户端
threading.Thread(target=my_tcp_server).start()
打印(“状态:可在”+datetime上进行网络访问
.datetime.now().strftime(“%A%d,共%B%Y,位于%H:%M:%S”))
尽管如此:
#持续读取端口以防止缓冲区累积
weatherStation.readline()
#每分钟开始时记录数据
如果datetime.datetime.now().strftime(“%S”)=“00”:
report=weatherStation.readline()。替换(“\r\n”,”)
timestamp=datetime.datetime.now(
).strftime(“%Y-%m-%dT%H:%m:%S”)
最终报告=”