gpt4 book ai didi

Python:套接字:处理蜂窝网络上的 TCP 连接

转载 作者:可可西里 更新时间:2023-11-01 02:34:22 24 4
gpt4 key购买 nike

我正在用 python 进行一些套接字编程,我在其中开发了一个客户端 TCP/IP 套接字来与慢速嵌入式设备进行通信。所以有时,当响应应该只有一个包时,它被分成两个包。我目前的解决方案是 sleep() python 程序,等待以确保我需要的所有数据都已经到达。

comSocket.send('\r')

sleep(1)

comSocket.send('\r')

comSocket.recv(128)

comSocket.send('\r\r')

comSocket.recv(256)



#sending I commands for data

comSocket.send('1I\r\r3I\r\r4I\r\r13I\r\r5I\r\r8I\r\r7I\r\r9I\r\r')

sleep(2)

#receiving data

rawData = comSocket.recv(512)

sleep(1.5)

我想知道是否有更好的方法来处理这种情况?

最佳答案

如果它是单个设备,您应该使用一个解决方案来为您处理低级 socket 交互...python 有几个像 pexpect , exscript , 或 paramiko (ssh only) ...如果它是多个设备并且您需要异步通信,请使用@zeekay 的答案(尽管如果您还不熟悉异步编程,尤其是扭曲编程,它会令人不快)。

我在这里回答了一个关于您远程登录并将命令列表发送到单个设备的方式的问题...

Catching a dying process in pexpect

上面的答案使代码高效,但对于初学者来说更难理解......下面的代码更简单,它在 TCP/23 上建立一个 telnet 连接,等待 *,发送命令,并将对命令的响应放入mydata1...

import pexpect as px
import sys

def send_this(child, retcode, COMMAND):
if retcode == 2:
child.sendline(COMMAND)
else:
raise RuntimeError, "Could not complete login, due to socket error"

def expect_this(child, EXPR, timeout = 10):
return child.expect([px.TIMEOUT, px.EOF, EXPR], timeout = timeout)

HOST = '192.168.49.49'
CMD1 = '1I'
PROMPT = '\*' #Note: you might not need the backslash
TIMEOUT = 10

child = px.spawn('telnet %s' % HOST)
retcode = expect_this(child, PROMPT)
send_this(child, retcode, CMD1)
retcode = expect_this(child, PROMPT)
mydata1 = child.before # mydata has the output from CMD1

无论采用何种解决方案,最重要的是调整超时,这样您就不必担心手机网络延迟过长(根据我的经验,有时会超过 5 秒)。

蜂窝通信中的另一个令人讨厌的动态是许多消费设备在移动时例行更改其 IP 地址(由于它们依赖 dhcp)...TCP 无能为力如果发生这种情况...如果您没有静态地址,则当设备提取新的 IP 地址时连接将断开。

关于Python:套接字:处理蜂窝网络上的 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6429559/

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