【问题标题】:Python SOCK_STREAM over internet互联网上的 Python SOCK_STREAM
【发布时间】:2009-09-19 08:55:44
【问题描述】:

我有一个简单的套接字客户端和服务器程序,它不能通过互联网工作

# Echo server program
import socket
import ImageGrab

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 3000              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
data = conn.recv(1024)
print data
conn.close()


# Echo client program
import socket
import ImageGrab
#destnation ip
HOST = '127.0.0.1'    # The remote host
PORT = 3000              # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send('Hello rushikesh')
s.close()
print 'Received'#, repr(data)

当我们尝试让它通过互联网工作时,它无法连接。程序如上所示,唯一的事情是目标 ip 被我的朋友 ip 替换。

在 localhost 上工作时,它工作得非常好,但不能在互联网上工作......

我使用SOCK_DGRAM 编写了程序,它仅适用于互联网上的小数据块。我想使用它来传输图像,所以我使用SOCK_STREAM 编写了它来传输图像,该图像在本地主机上成功运行,但无法通过互联网运行。所以我确实写了最简单的程序,但仍然出现同样的问题

有人可以指导我完成这个...

【问题讨论】:

  • 据说host as 'localhost' or '127.0.0.1' 只会监听lan,而'0.0.0.0' 会监听所有的adapter。

标签: python sockets


【解决方案1】:

您采用了正确的方法,但您可能遇到了网络或防火墙问题。根据您朋友的网络配置方式,他可能位于 NAT 或防火墙之后,阻止您直接连接到他的计算机。

为了消除一半的问题,您可以使用telnet作为客户端,与服务器进行简单的连接,看看是否可用:

telnet 127.0.0.1 3000

如果telnet 连接成功,则网络正常。如果失败,则说明有其他问题(可能会为您提供有助于发现问题的信息)。

【讨论】:

  • 您好,telnet 连接失败。但是使用 SOCK_DGRAM 的 p2p 通信工作正常,给了我类似聊天的功能,也适用于小图像。是不是 SOCK_STREAM 需要连接,而 SOCK_DGRAM 通过一些不同的机制工作..
  • 我们之间没有任何代理或 NAT。我们有来自 isp 的通用宽带连接。我们没有静态 ip。这可能是原因吗?但是 SOCK_DGRAM 是如何工作的。可能是 SOCK_DGRAM 不需要静态 ip 吧?
  • 可能是服务器端的 isp 阻塞了监听(服务器)TCP 套接字?如果你在那里启动一个网络服务器,它可以通过互联网工作吗?
  • 有什么方法可以实现呢?我尝试了扭曲的数据报服务器客户端,但它仍然无法通过互联网工作。像 C-space cspace.in 这样的 p2p 程序可以通过 Internet 传输二进制文件并在我的电脑上运行
  • 我认为您的下一个方法应该是使用 tcpdump 之类的东西,或者为您的操作系统使用任何等效的网络嗅探器。找出有问题的数据包是否真的从 A 点到达 B 点。
猜你喜欢
  • 2015-01-07
  • 2018-08-05
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多