python - 让 Python 套接字对外界可见?

标签 python sockets client

我已经有一个非常相似的帖子,但我越来越沮丧,因为我的网络设置似乎没有问题。从外面可以看到其他软件(netcat 监听服务器等),但看不到我的脚本。这怎么可能?? 注意:它适用于 LAN,但不适用于 Internet。

服务器:

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()

有人请帮助我。

非常感谢任何帮助。

jack

最佳答案

再次编辑添加:

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

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

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

host = ''
port = 63001


bind(host,port)

这在 python 中的作用是将套接字绑定(bind)到环回适配器(或 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更改客户端连接到localhost

  2. 更改服务器以通过更改 host = 80.xxx.xxx.xxx 绑定(bind)到您的 Internet 适配器

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

编辑添加:**

好的,您的最新修订版仍然无法正常工作,因为 65535 是可用的最大帖子。

下面的答案是对问题的原始修订。

在您发布的代码中,您正在监听(绑定(bind))端口 63001,但您的客户端应用程序正在尝试连接到端口 80。这就是为什么您的客户端无法与您的服务器通信的原因。您的客户端需要使用端口 63001 而不是端口 80 进行连接。

此外,除非您正在运行 HTTP 服务器(或者您的 Python 服务器将处理 HTTP 请求),否则您真的不应该绑定(bind)到端口 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 ))

关于python - 让 Python 套接字对外界可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3112980/

相关文章:

python - 通过子类化修改命名元组的构造函数参数?

python - 对 xml 的 SOAP 响应

Python: '{0.lower()}' .format ('A' ) 产生 'str' 对象没有属性 'lower()'

java - Android 不抛出 SocketException?

c - 逐行读取套接字但出现内存问题

java - 如何在客户端和服务器之间传输多个文件?

client - 当客户对交货的 react 是否定的时,如何 react ?

python - open() 中的整数文件描述符 "0"

android - 确定连接到 android wifi 热点的每个客户端使用的总数据

python - 无法在 Windows XP 上运行 Python EXE