我正在尝试编写一个程序来发送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))
如果我在打印的东西周围加上括号,它只是将它打印在屏幕上。
我需要做些什么来完成这项工作?
答案 0 :(得分:51)
使用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))
答案 1 :(得分:8)
您的代码对我有效。我正在使用Linux上的netcat验证这一点。
使用netcat,我可以执行nc -ul 127.0.0.1 5005
来监听数据包:
话虽这么说,这是我在运行你的脚本时看到的输出,同时运行netcat。
[9:34am][wlynch@watermelon ~] nc -ul 127.0.0.1 5005
Hello, World!
答案 2 :(得分:2)
如果您正在运行python 3,那么您需要将print语句更改为print函数,即在print语句后将括号放在括号()中。
除非你有{strong}发送数据包而非接收,否则您将看到以上所做的唯一事情就是打印,除非您有127.0.0.1 port 5005
的内容 - 所以你需要在另一个控制台窗口第一个中实现并启动示例的其他部分,以便它等待消息。
答案 3 :(得分:0)
这是一个完整的示例,已经在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
答案 4 :(得分:0)
Manoj答案是正确的,但是另一个选择是使用MESSAGE.encode()或encode('utf-8')转换为字节。字节和编码基本相同,编码与python 2兼容。有关更多信息,请参见here
完整代码:
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))