我想看看套接字是如何工作的,所以我浏览了HOWTO和文档并尝试编写自己的代码。服务器端如下所示:
ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
assert socket.gethostname() == HOST
ssock.bind((HOST, PORT))
ssock.listen(5)
while True:
csock, address = ssock.accept()
print('Accepted connection from', address)
t = threading.Thread(target=server, args=(csock,))
t.start()
客户端是:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
这些都在一个模块中,因此常量是相同的。这行不通。当我尝试连接时,我得到一个ConnectionRefusedError: [Errno 111] Connection refused
.
但是:
当我尝试通过主机名连接到另一个端口时,它可以工作:
In [4]: s.connect((HOST, 22)) In [5]: s.recv(1024) Out[5]: b'SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1\r\n'
(显然,不是我的应用程序处理服务器上的连接)。
当我在服务器代码中将主机名更改为本地 IP 地址时,我也可以连接到我的端口(使用 IP 作为主机字符串)。
这些情况的结合使我感到困惑。谁能解释这种行为?
编辑:HOST
如果我在服务器代码中使用 IP,似乎我也可以连接。但是为什么它不像在 HOWTO 中那样工作呢?