使 Python 套接字对外界可见

问题描述 投票:0回答:2

我的网络设置似乎没有任何问题,但是可以从外部看到其他软件(netcat 监听服务器等),但看不到我的脚本。怎么会这样?

它可以在 LAN 上运行,但不能通过互联网运行。

服务器:

import socket

host = ''
port = 80001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(1)
print 'Listening..'
conn, addr = s.accept()
print 'is up and running.'
print addr, 'connected.'
s.close()
print 'shut down.'

客户:

import socket
host = '80.xxx.xxx.xxx'
port = 80001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.close()
python sockets client
2个回答
9
投票

我认为您可能缺少一些有关套接字通信的基础知识。为了使套接字正常工作,您需要确保客户端和服务器上的套接字能够满足。使用最新版本,您的服务器现在绑定到端口 63001,但在本地环回适配器上:127.0.0.1

计算机有多个网络适配器,至少有 2 个:一个是本地环回,它允许您以快速、高性能的方式与同一台计算机建立网络连接(用于测试、ipc 等),还有一个网络适配器可以让您连接到实际网络。许多计算机可能有更多的适配器(用于 VLAN 的虚拟适配器、无线适配器与有线适配器等),但它们至少有 2 个。

因此,在您的服务器应用程序中,您需要指示它将套接字绑定到正确的网络适配器。

host = ''
port = 63001


bind(host,port)

这在 python 中的作用是将套接字绑定到环回适配器(或 127.0.0.1/localhost)。

在您的客户端应用程序中,您有:

host = '80.xxx.xxx.xxx'
port = 63001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))

现在您的客户端尝试做的是连接到 80.xxx.xxx.xxx(这是您的无线互联网适配器)上端口 63001 的套接字。

由于您的服务器正在侦听您的环回适配器,并且您的客户端正在尝试连接您的无线适配器,因此失败,因为两端不相交。

所以你这里有两个解决方案:

  1. 将客户端更改为通过

    host = 127.0.0.1

    连接到本地主机
  2. 通过更改

    host = 80.xxx.xxx.xxx

    更改服务器以绑定到您的互联网适配器

    现在,使用 localhost 的第一个解决方案仅当服务器和客户端位于同一台计算机上时才有效。无论您尝试什么机器,本地主机总是指向自身(因此是环回)。因此,如果/当您决定将客户端/服务器连接到互联网时,您将必须绑定到互联网上的网络适配器。

使用您的最新版本,它仍然无法工作,因为

65535
是可用的最大帖子。

以下答案是针对问题的原始修订版。

在发布的代码中,您正在侦听(绑定)端口

63001
,但您的客户端应用程序正在尝试连接到端口
80
。这就是为什么您的客户端无法与您的服务器通信的原因。您的客户端需要使用端口
63001
而不是端口
80
进行连接。

另外,除非你正在运行 HTTP 服务器(或者你的 python 服务器将处理 HTTP 请求),否则你真的不应该绑定到端口

80

在您的客户端代码更改中:

import socket
host = '80.xxx.xxx.xxx'
port = 63001

在您的服务器代码中:

import socket

host = ''
port = 63001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostbyname(socket.gethostname()), port ))

1
投票

在您的服务器脚本中,您有

port = 80
,但您从未使用过它。 看起来服务器正在侦听 63001。客户端正在连接到 80。

如果您要使用 80,请确保没有 http 服务器同时尝试使用该端口。

© www.soinside.com 2019 - 2024. All rights reserved.