Python发送UDP数据包

use*_*619 40 python sockets

我正在尝试编写一个程序来发送UDP数据包,如 https://wiki.python.org/moin/UdpCommunication中的代码似乎是在Python 2中:

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = "Hello, World!"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE

sock = socket.socket(socket.AF_INET, # Internet
             socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
Run Code Online (Sandbox Code Playgroud)

如果我在打印的东西周围加上括号,它只是将它打印在屏幕上.

我需要做些什么来完成这项工作?

Man*_*dey 56

使用Python3x,您需要将字符串转换为原始字节.您必须将字符串编码为字节.通过网络,您需要发送字节而不是字符.你是对的,这适用于Python 2x,因为在Python 2x中,套接字上的socket.sendto采用"普通"字符串而不是字节.试试这个:

print("UDP target IP:", UDP_IP)
print("UDP target port:", UDP_PORT)
print("message:", MESSAGE)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.sendto(bytes(MESSAGE, "utf-8"), (UDP_IP, UDP_PORT))
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于文本消息。请记住,您可以使用这些函数通过网络传输和接收任意数据,因此您不能总是假设解码/编码为 utf8 有意义。 (2认同)

Bil*_*nch 9

您的代码适用于我.我在Linux上使用netcat来验证这一点.

使用netcat,我可以nc -ul 127.0.0.1 5005在以下位置监听数据包:

  • IP:127.0.0.1
  • 港口:5005
  • 协议:UDP

话虽这么说,这是我在运行你的脚本时看到的输出,同时运行netcat.

[9:34am][wlynch@watermelon ~] nc -ul 127.0.0.1 5005
Hello, World!
Run Code Online (Sandbox Code Playgroud)