让Python套接字对外界可见?

时间:2010-06-24 18:46:16

标签: python sockets client

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

服务器:

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

有人请帮助我。

非常感谢任何帮助。

杰克

2 个答案:

答案 0 :(得分:7)

再次编辑添加:

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

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

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

host = ''
port = 63001


bind(host,port)

这在python中的作用是将套接字绑定到loopback适配器(或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. 更改客户端以连接到localhost
  3. 通过更改host = 80.xxx.xxx.xxx

    ,将服务器更改为绑定到您的互联网适配器

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

  4. 编辑添加:**

    好的,您的最新版本仍然无效,因为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 :(得分:1)

在您的服务器脚本中,您有port = 80,但您从未使用它。看起来服务器正在侦听63001.而客户端正在连接到80。

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