[英]Python send UDP packet
我正在尝试编写一个程序来发送 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))
如果我在打印的内容周围加上括号,它只会将其打印在屏幕上。
我需要做什么才能完成这项工作?
使用 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))
你的代码对我来说是有效的。 我正在通过在 Linux 上使用netcat来验证这一点。
使用 netcat,我可以做nc -ul 127.0.0.1 5005
它将在以下位置侦听数据包:
话虽如此,这是我在运行您的脚本时看到的输出,同时运行 netcat。
[9:34am][wlynch@watermelon ~] nc -ul 127.0.0.1 5005
Hello, World!
如果您运行的是python 3,那么您需要将print 语句更改为print 函数,即在print 语句之后将内容放在方括号() 中。
除非您在127.0.0.1 port 5005
上侦听某些内容,否则您将看到以上所做的唯一一件事,因为您正在发送未收到它的数据包- 因此您需要在另一个控制台中实现并启动示例的另一部分窗口第一,所以它正在等待消息。
上面的 Manoj 答案是正确的,但另一种选择是使用 MESSAGE.encode() 或 encode('utf-8') 转换为字节。 bytes 和 encode 大体相同,encode 与 python 2 兼容。更多信息请看这里
完整代码:
import socket
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = "Hello, World!"
print("UDP target IP: %s" % UDP_IP)
print("UDP target port: %s" % UDP_PORT)
print("message: %s" % MESSAGE)
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE.encode(), (UDP_IP, UDP_PORT))
这是一个在 CentOS 7 上用 Python 2.7.5 测试过的完整示例。
#!/usr/bin/python
import sys, socket
def main(args):
ip = args[1]
port = int(args[2])
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
file = 'sample.csv'
fp = open(file, 'r')
for line in fp:
sock.sendto(line.encode('utf-8'), (ip, port))
fp.close()
main(sys.argv)
该程序从当前目录读取文件sample.csv
并在单独的 UDP 数据包中发送每一行。 如果该程序保存在名为send-udp
的文件中,则可以通过执行以下操作来运行它:
$ python send-udp 192.168.1.2 30088
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.