无法从python套接字接收答案

时间:2017-12-11 14:07:33

标签: linux python-2.7

我有一个针对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()

我想我做错了什么。

1 个答案:

答案 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)

上面的代码等待消息,然后发回响应。