Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 套接字读取echo';回寄旧邮件?_Python_Sockets - Fatal编程技术网

Python 套接字读取echo';回寄旧邮件?

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

我正在尝试使用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("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中得到了回音。啊!非常感谢大家!!