互联网上的 Python SOCK_STREAM

Posted

技术标签:

【中文标题】互联网上的 Python SOCK_STREAM【英文标题】:Python SOCK_STREAM over internet 【发布时间】: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。 【参考方案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 点。

以上是关于互联网上的 Python SOCK_STREAM的主要内容,如果未能解决你的问题,请参考以下文章

如何将互联网上的图像保存到 Python 中的本地文件

PL/I 程序中的 z/OS MVS 和 z/OS UNIX 互操作?

计算机网络概述

python--8socket网络编程

什么是搜索引擎?

python手机文件上传至电脑?