57

我正在尝试编写一个程序来发送 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))

如果我在打印的内容周围加上括号,它只会将其打印在屏幕上。

我需要做什么才能完成这项工作?

4

5 回答 5

80

使用 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))
于 2013-09-11T16:21:57.870 回答
10

你的代码对我来说是一样的。我正在通过在 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!
于 2013-09-11T14:35:45.887 回答
2

如果您正在运行 python 3,那么您需要将打印语句更改为打印函数,即将打印语句后面的内容放在括号 () 中。

您将看到上面所做的唯一一件事就是打印,除非您在127.0.0.1 port 5005发送数据包时没有收到它时有监听 - 所以您需要首先在另一个控制台窗口中实现并启动示例的另一部分,所以它是等待消息。

于 2013-09-11T14:43:21.167 回答
1

上面的 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))
于 2020-06-09T05:57:37.260 回答
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
于 2018-11-13T15:33:31.060 回答