我有一个针对linux的工作命令,它发送请求并获得响应:
if (audio.paused == false){
audio.pause();
}else{
audio.play();
}
我试图通过python做同样的事情:
echo -n -e '\x9e\x4c\x23\x00\x00\xff\xff\xce\xf2\x3b\x18\x80' | nc -u -w 1 -p 11244 127.0.0.1 11235
我收到一个空白的回复:
import socket
IP = "127.0.0.1"
PORT = 11235
MESSAGE = "9e4c230000ffffcef23b1880"
BINARY_MESSAGE = MESSAGE.decode('hex')
print ("BINARY_MESSAGE: [%s]" % BINARY_MESSAGE) # <- message is the same as echo -en does
srvsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srvsock.settimeout(3) # 3 seconds
srvsock.connect((IP, PORT))
srvsock.sendall(BINARY_MESSAGE)
data = srvsock.recv(4096)
print ("Received message: [%s]" % data)
srvsock.close()
我想我做错了什么。
答案 0 :(得分:1)
您的nc
命令行正在使用UDP(-u
)。您的Python代码使用TCP(socket.SOCK_STREAM
)。您想要创建UDP套接字:
srvsock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
您希望摆脱对connect
的呼叫,但如果您希望在该套接字上接收消息,则需要拨打bind
。例如,以下代码发送消息,然后等待同一套接字上的回复:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 2222))
s.sendto('this is a test', ('127.0.0.1', 3333))
data, srcaddr = s.recvfrom(1024)
print(data, srcaddr)
请记住,UDP是一种无连接协议。这次谈话的另一面不能“回复”这个消息;它需要显式发送到上面代码正在侦听的地址/端口。在Python中,此对话的另一面可能如下所示:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 3333))
data, srcaddr = s.recvfrom(1024)
print(data)
s.sendto('that was a test', srcaddr)
上面的代码等待消息,然后发回响应。