gpt4 book ai didi

python - 多线程套接字客户端冲突

转载 作者:可可西里 更新时间:2023-11-01 02:53:27 26 4
gpt4 key购买 nike

是否可以通过共享公共(public)套接字或使用独立套接字的多个线程在单个端口上与 TCP 套接字服务器通信,而无需锁定机制或其他跨线程通信技术?

我的具体问题:

我是 python 套接字编程的初学者,正在尝试编写一个库来连接联网的家庭自动化设备 (GlobalCache GC100)

我需要通过 TCP 持续监听来自该硬件的传感器状态更改事件,并且能够在用户启动的时间发送 set_state 命令(跳闸继电器),而不会出现明显延迟。

我有一个 while True: 循环,它执行 socket.recv() 以拾取状态更改事件。这通常会超时 (socket.settimeout(10)) 并继续下一个循环迭代,直到设备推送状态更改数据。

现在最重要的是,我需要用户能够发送 set_state 命令,我不希望用户需要等到 socket.recv() 超时并在 recv() 循环之间注入(inject)通信迭代。所以我选择使用它自己的套接字将 tcp 监听循环拆分为一个单独的线程(但指向相同的主机和端口)。

问题是 set_state 线程中的套接字似乎杀死了监听线程中的套接字,反之亦然。似乎只有最近创建/连接的套接字才真正起作用。

我是否正在尝试做一些套接字编程不可能做的事情,或者这可能只是我设备 (GC-100) 上套接字服务器实现的限制?

到目前为止,我能看到的唯一解决方案是将所有套接字通信保持在一个线程中,使用一个公共(public)套接字,实现一个通信队列,并将 tcp 监听部分的超时持续时间保持在一个非常小的值,因此 set_state 命令必须在队列中等待最短的时间。但这似乎不太理想而且有些脆弱。

编辑:

It is the socket pair (the 4-tuple consisting of the client IP address, client port number, server IP address, and server port number) that specifies the two endpoints that uniquely identifies each TCP connection in an internet. (TCP-IP Illustrated Volume 1, W. Richard Stevens)

我想也许我需要强制改变不同线程中多个套接字使用的源端口。我尝试了 socket.bind(hostname, source_port) 但不断收到地址已被使用的错误,对于所有似乎合理的主机名和源端口组合。

最佳答案

虽然在他们的 API 文档中没有提及,但我相信这是 GC-100 服务器实现的一个限制。关于如何实现可以支持来自多个主机的多个同时连接的 tcp 服务器,有大量示例。然而,我配置了两个不同的主机来连接到设备,而设备一次只允许连接到一个主机。

因此对我来说似乎唯一的解决方案是使用单个套接字,并多路复用所有读写。

http://wiki.linuxmce.org/index.php/GlobalCache_GC-100#Implementation_details

The gc100 software architecture uses two threads to communicate with the gc100 regarding relays, IR transmitters and sensors, one for sending messages (SocketThread) and one for receiving (EventThread). The reason for this is that the gc100 protocol isn't completely a request-reply protocol, even if it seems like that at first. The gc100 can initiate a transmission when a sensor is tripped, enough to break the request-reply paradigm. The program was designed to treat the communication as asynchronous. Messages are sent to the device without expecting a reply, and the replies are treated as independent events and state change reports, without linking a request to a reply in the program logic (except for the initialization phase).

关于python - 多线程套接字客户端冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46751804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com