Python 套接字读取echo';回寄旧邮件?
我正在尝试使用Python中的套接字对嵌入式设备进行非常简单的读/写操作。出于某种原因,sock.recv()命令返回的是我发送的字符串,而不是预期的返回字符串。下面是我如何打开插座的:Python 套接字读取echo';回寄旧邮件?,python,sockets,Python,Sockets,我正在尝试使用Python中的套接字对嵌入式设备进行非常简单的读/写操作。出于某种原因,sock.recv()命令返回的是我发送的字符串,而不是预期的返回字符串。下面是我如何打开插座的: HOST1 = '192.168.1.201' PORT1 = 4998 sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM) sock.connect((HOST1, PORT1)) while (1): sock.sendall("ge
HOST1 = '192.168.1.201'
PORT1 = 4998
sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST1, PORT1))
while (1):
sock.sendall("getstate,1:1\r")
state1 = sock.recv(32)
sock.sendall("getstate,1:2\r")
state2 = sock.recv(32)
print "states:", state1, state2
预期的返回字符串(state1或state2)是当前设备状态,其形式为“状态,1:1,0”(关闭)或“状态,1:1,1”(打开)。但是,我经常返回自己的命令(“getstate..”命令),而不是返回字符串。我以为sock.sendall()会清除发送缓冲区?我是一个有插座的noob,所以任何帮助都将不胜感激。我已经对此进行了广泛的搜索,但我找不到有同样问题的人。我已经手动测试了远程设备,它总是返回预期的返回字符串,因此我相信问题一定是我使用套接字的方式。您使用这些套接字的方式是完全合理的。您是否尝试过使用
\r\n
或\n
而不是\r
。可能设备回显您的请求是错误的?请尝试使用netcat(nc 192.168.1.201:4998
)与服务器交互,以查看它是否真的以您期望的方式响应。同时,甚至不需要“清除发送缓冲区”;发送缓冲区和接收缓冲区是完全独立的,除非操作系统或驱动程序中存在巨大缺陷,否则任何东西都不可能从一个“泄漏”到另一个。你在recv
中看到的任何消息都是由另一方发送的。还有一种可能性:设备的协议是否真的保证\r
在一个方向上是分隔符,而所有消息在另一个方向上正好是32字节?天哪,我是个白痴。杰莱希间接地发现了这一点。读取缓冲区尚未从先前的发送命令中清除。我读取状态的原因是为了确保之前设置的状态得到正确处理。在前面的一行代码中,我这样做了:s.sendall(“setstate,1:1,0\r”),echo返回我的命令以确认它已被接收。但是,我没有读这个返回字符串。因此,当我使用getstate和read请求返回的状态时,我首先从前面的setstate中得到了回音。啊!非常感谢大家!!