python - 如何通过互联网在两台计算机之间建立 UDP 连接

标签 python networking udp

我正在尝试 python 网络编程基础一书中的示例,其中列出了一个简单的 UDP 客户端/服务器程序。第一个程序在同一台机器上有客户端/服务器,但第二个程序有服务器监听任何机器。书中没有详细介绍如何在两台机器之间建立连接。

我有两台电脑都连接到互联网。我如何配置它们以相互发送和接收数据包。

这是示例的源代码:

#!/urs/bin/env python
# UDP client and server for talking over a network

import random, socket, sys

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

MAX  = 65535
PORT = 1060

if 2<= len(sys.argv) <= 3 and sys.argv[1] == 'server':
    interface = sys.argv[2] if len(sys.argv)>2 else ''
    s.bind((interface,PORT))
    print 'Listening at ', s.getsockname()
    while True:
        data, address = s.recvfrom(MAX)
        if random.randint(0,1):
            print 'The client at ', address, 'says:', repr(data)
            s.sendto('Your data was %d bytes ' % len(data) ,address)
        else:
            print 'Pretending to drop packet from ', address


elif len(sys.argv)==3 and sys.argv[1] == 'client':
    hostname = sys.argv[2]
    s.connect((hostname,PORT))
    print 'Client socket name is', s.getsockname()
    delay = 0.1
    while True:
        s.send('This is another message')
        print 'Waiting up to', delay, 'seconds for a reply'
        s.settimeout(delay)
        try:
            data = s.recv(MAX)
        except socket.timeout:
            delay *= 2 # wait even longer for the next request
            if delay > 2.0:
                raise RuntimeError('I think the server is down')
        except:
            raise # a real error so we let the user see it
        else: 
            break
    print 'The server says ', repr(data)

我找到了作为服务器运行的计算机的公共(public) IP,并尝试从另一台作为客户端运行的计算机连接到它,但没有得到响应。我在两台计算机上都不在代理后面。

最佳答案

首先,如果你真的想尝试这样的应用程序并学习,你需要将这两台机器连接到同一子网内的本地网络,这样每台机器的地址都像 192.168.x.2 和 192.168.x.2 , 这样你就会知道发生了什么......

然后,当您在一台机器上运行上述应用程序时,它作为“_application_name 服务器”运行,而在另一台机器上作为“_application_name 客户端”运行。您会看到两台机器都已连接并开始在您的本地网络中进行通信。

在 Internet 上,由于有很多安全通道,很难让您的 IP/PORT 正常工作,而且您几乎无法获得想要的东西。

关于python - 如何通过互联网在两台计算机之间建立 UDP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11180035/

相关文章:

linux - LL_ALLOCATED_SPACE 和其他注意事项

c - 丢包率超过 65% 的 Echo 客户端

c - 如何从 Linux 上的特定接口(interface)发送 UDP 数据包?

c++ - ipv6 向后兼容 ipv4 吗?

python - 完全独立于脚本运行命令

python - 尽管我安装了模块,但在 VS 代码中未发现错误

python - 重复函数应用

python - PyQt5 获取另一个小部件的位置?

networking - 如果 TCP 是面向连接的,为什么数据包会遵循不同的路径?

ruby TCP : Any benchmarks?