如何在互联网上建立两台计算机之间的UDP连接

4

我正在尝试一本名为《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)

我发现了作为服务器运行的计算机的公共IP,并尝试从另一台作为客户端运行的计算机连接它,但我没有得到响应。两台计算机都没有使用代理。

可能存在无数防火墙和过滤器在你和它之间。 - bmargulies
或者在NAT后面,因此可能需要进行端口转发 ;) - Manos
1060端口被IANA保留 - user207421
@EJP的文章提到了这一点。引用内容:“所以,我浏览了一下列表,并冒险猜测您,亲爱的读者,不会在运行SAP BusinessObjects Polestar……” - yayu
这不是重点。网络服务提供商可能会完全拒绝传输UDP,或者除非您运行与已知端口相对应的服务,否则他们可能会拒绝传输它。 - user207421
2个回答

1
首先,如果您真的想尝试这种应用程序并学习它,您需要将这两台机器连接到同一子网内的本地网络中,以便每台机器都具有像 192.168.x.2 和 192.168.x.2 这样的地址,这样您就会知道正在发生什么...
然后,在一台机器上运行上述应用程序并作为“_application_name 服务器”运行,在另一台机器上作为“_application_name 客户端”运行。您将看到两台机器已连接并开始在您的本地网络内通信。
在互联网上,由于安全通道众多,很难使您的 IP/PORT 正常工作,因此您几乎无法得到想要的结果。

1

假设您的代码文件名为cs.py,服务器接口地址为192.168.1.2,服务器外部地址(互联网地址)为2.2.2.2

在服务器上运行
cs.py server 192.168.1.2

确保您的服务器端路由器在LAN和WAN之间具有NAT功能

在客户端上运行
cs.py client 2.2.2.2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接