【问题标题】:Python + netcat, only the first message is sent over UDPPython + netcat,只有第一条消息通过 UDP 发送
【发布时间】:2017-05-12 14:07:01
【问题描述】:

我有这段代码作为 UDP 客户端:

import socket

data = "Hello world!"
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print 'sending %s to 127.0.01:9000', data
sent = sock.sendto(data, ('127.0.0.1', 9000))
print 'sent: %s' % sent
sock.close()

以下是我的“服务器”:

nc -u -l 127.0.0.1 9000

这个例子有效……但只有一次。当我第一次运行我的脚本时,我将我的消息发送到服务器(一切都在同一台机器上完成)并看到“Hello world”被打印出来。都好。当我第二次运行我的脚本时,我看不到第二个 hello world。

请注意,但由于我无法控制的情况,我使用的是 Python 2.6。

这里发生了什么?是否有需要刷新的缓冲区?

当我从 Python 运行时环境运行代码时会发生以下情况(不,netcat 中的结果不会改变):

Python 2.6.6 (r266:84292, Aug  9 2016, 06:11:56) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> sent = sock.sendto("Hello world!", ('127.0.0.1', 9000))
>>> print sent
12
>>> sock.close()

【问题讨论】:

    标签: python udp python-2.6 netcat


    【解决方案1】:

    好的。停止使用 netcat 测试您的代码。 请改用此代码:

    import socket
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(('127.0.0.1', 9000))  # (host, port) because AF_INET
    print("Listening...")
    
    while True:
        print(sock.recv(15)) # buffer size
    

    您可以根据自己的情况更改主机、端口和缓冲区大小。

    【讨论】:

    • 这行得通。但奇怪的是 nc 的行为方式是这样的。也许我误解了该实用程序的工作原理,问题不在于 UDP。
    【解决方案2】:

    【讨论】:

    • 当我执行以下“nc -kluvw 1 localhost 9000”时,我的 Python 脚本中看不到任何内容。
    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多