2012-07-04 112 views
0

我使用python -m SimpleHTTPServer在端口8000上创建了一个python服务器。使用Python中的套接字连接到python服务器2.7

当我访问这个网址从我的网页浏览器它显示了以下内容

enter image description here

现在,我要使用Python得到上面的内容。所以,对于我所做的是

>>> import socket 
>>> s = socket.socket(
...  socket.AF_INET, socket.SOCK_STREAM) 
>>> s.connect(("localhost", 8000)) 
>>> s.recv(1024) 

s.recv(1024)没有任何反应后,它只是在那里等候,并打印什么。

所以,我的问题是如何使用python获取上面的目录内容输出。也可以有人建议我在socket programming with python上的教程。我不太喜欢官方教程。

我也观察到一个奇怪的事情,当我尝试使用python接收内容,并且当时什么也没有发生,我无法从我的web浏览器访问localhost:8000,但只要我杀了我的python程序,我就可以访问它。

+1

这不是你需要的套接字编程,而是HTTP协议规范。另外,根据你正在编写你的程序,有一些模块可以用来为你说HTTP ... – deStrangis

回答

4

可以说,在python中通过http获取内容的最简单方法是使用urllib2模块。例如:

from urllib2 import urlopen 
f = urlopen('http://localhost:8000') 
for line in f: 
    print line 

这将打印出由SimpleHTTPServer托管的文件。

+0

因此,如果我理解我想要实现的是不可能使用套接字的权利? – RanRag

+1

@Noob好吧,对于我认为你想要做的事,你需要套接字,但是你不需要直接使用它们。本质上IP使用套接字,TCP使用IP,HTTP使用TCP。你不想重建所有这些只是为了访问网站上的数据。 –

3

但是在s.recv(1024)之后没有任何事情发生,它只是在那里等待并且什么都不打印。

您只需打开一个套接字并等待数据,但这不是HTTP协议的工作方式。如果您想要收到回复,您必须先发送请求(基本上,您必须告诉服务器要列出哪个目录或要下载哪个文件)。如果你真的想,你可以使用原始套接字发送请求来训练你的技能,但强烈建议使用正确的库(参见Matthew Adams的回复和urllib2示例)。

我还观察到一个奇怪的东西,当我尝试接收使用Python和没有任何反应,当时我无法访问本地主机内容:从我的网页浏览器8000,但只要我杀了我的Python程序,我可以访问它。

这是因为SimpleHTTServer是单线程的并且不支持同时连接多个连接。如果你想修复它,请看这里的答案:BasicHTTPServer, SimpleHTTPServer and concurrency