Python + 套接字

5 投票
2 回答
2152 浏览
提问于 2025-04-15 11:12

我需要创建一个连接服务器和客户端的程序。我用的代码是:

import socket

HOST = 'localhost'
PORT = 50007      
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    conn.send(data)
conn.close()

客户端:

import socket

HOST = 'localhost'   
PORT = 50007             
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)

这个程序运行得很好!但是如果服务器是在没有路由器的电脑上创建的就没问题。如果你有路由器,在创建服务器之前,你需要在调制解调器上打开50007这个端口。那我该怎么在所有电脑上创建服务器,而不需要开启端口呢?像Torrent客户端就能做到这一点。谢谢。

2 个回答

2

很难理解你的问题...

(...) 种子下载软件是可以做到这一点的。

种子下载软件之所以能做到这一点,是因为路由器,也就是互联网网关设备(IGD),支持uPNP协议。对于你的问题,最有趣的部分是关于NAT穿透的内容

7

这个问题有点让人困惑,但我会尽量帮你理解。简单来说,如果服务器上的端口(50007)被防火墙封锁了,那么你就无法从客户端连接到这个端口。这就是防火墙的作用。很多协议(比如SIP和bittorrent)确实会使用一些方法来穿越防火墙和网络地址转换(NAT),但这是个复杂的话题,你可以在这里了解更多信息。你会注意到,要有效使用bittorrent,你需要为NAT启用端口转发,并且解锁防火墙的端口范围。此外,bittorrent在大多数数据传输中使用tcp连接。这里有几个要点:

首先,注意BitTorrent程序需要建立两种类型的连接:

  • 向跟踪器发出的HTTP连接,通常使用端口6969。
  • 与其他用户机器之间的进出连接,通常使用端口6881及以上。

撰写回答