Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1316220
  • 博文数量: 161
  • 博客积分: 10192
  • 博客等级: 上将
  • 技术积分: 2165
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 17:09
文章分类

全部博文(161)

文章存档

2012年(2)

2011年(13)

2010年(137)

2009年(5)

2008年(4)

我的朋友

分类: LINUX

2010-09-14 09:43:46

Homepage:
os: centos5.5
python: 2.4
lib: /usr/lib/python2.4

1.以HTTP方式共享当前文件夹的文件

$ python -m SimpleHTTPServer

这命令启动了Python的SimpleHTTPServer模块,考虑到Python在绝大多数的Linux发行版当中都默认安装,所以这个命令很可能是最简单的跨平台传文件的方法。

命令执行后将在本机8000端口开放HTTP服务,在其他能访问本机的机器的浏览器打开ttp://ip:8000即打开一个目录列表,点击即可下载。

2.先看看这个最简单的web服务器.

 

import SimpleHTTPServer
SimpleHTTPServer.test()

当然,这个server只能在localhost下面运行.但是却可以提供静态页面显示.

再看一个稍微复杂的.

import SimpleHTTPServer
import SocketServer

PORT = 8800

handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("192.168.1.103",PORT),handler)
print 'serving at port',PORT
httpd.serve_forever()

上例,先创建了个tcp的server,不过,采用simple http request handler作为其handler.这样一来,你可以用网内的机子来访问这个web server了.有一点要注意,就是你的html文件目录和当前的脚本所在目录是一致的.

再往后看:

 

import SimpleHTTPServer
import SocketServer
import os

PORT = 8800
WEBDIR = "/www"

class Handler(SimpleHTTPServer.SimpleHTTPRequestHandler):
        def translate_path(self,path):
                os.chdir(WEBDIR)
                return SimpleHTTPServer.SimpleHTTPRequestHandler.translate_path(self,path)

try:
        #handler = SimpleHTTPServer.SimpleHTTPRequestHandler
        httpd = SocketServer.TCPServer(("192.168.1.103",PORT),Handler)
        print 'dir %s serving at port %s' % (repr(WEBDIR),PORT)
        httpd.serve_forever()
except:
        pass

这个例子较上例是,可以设定html所在的目录.

如果不想用socketServer,可以直接用BaseHttpServer,他继承自SocketServer.

 

import BaseHTTPServer
import SimpleHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import HTTPServer

def run(server_class = BaseHTTPServer.HTTPServer,
        handler_class = SimpleHTTPRequestHandler):
    server_address = ('',8000)
    httpd = server_class(server_address,handler_class)
    httpd.serve_forever()

if __name__ == "__main__":
    run()


3.
接上文.在本地做测试的时候,应该是完全没问题的.但是在两台互通的机器上面做的时候,我在做实验的时候却老是不通.想来想去,只能想到是防火墙的原因了.
我的server端采用的是fedora10,测试客户机是vista.用client来ping server的时候是成功的,但是用server来ping client的时候是失败的.将vista的防火墙关掉,ping是成功的.
然后打开fedora的防火墙设置.system=>adminstrator=>firewall.将所要使用的服务改为trust.如果要用不在列表中的端口,在others里面把其它所要用的端口号加进去,然后一切便OK了.
下面的例子是使用simple http server作为一个代理服务器.
 

import SocketServer
import SimpleHTTPServer
import urllib

PORT = 1234

class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        self.copyfile(urllib.urlopen(self.path), self.wfile)

httpd = SocketServer.ForkingTCPServer(('', PORT), Proxy)
print "serving at port", PORT
httpd.serve_forever()

有兴趣的朋友可以自行调试.

4.好了,现在我们再看一下怎么搞cgi server.
基本上代码不变,只不过要将handler改成CGIHTTPRequestHandler.
 

from CGIHTTPServer import CGIHTTPRequestHandler
from BaseHTTPServer import HTTPServer
server_addr = ('192.168.1.103',8000)
httpd = HTTPServer(server_addr,CGIHTTPRequestHandler)
httpd.serve_forever()

这样一来,服务器相当于搞定了.当然我们要看一下怎么显示一个动态页面.动态语言依旧用python,在server的同级目录建一个cgi-bin目录,在这个目录里面建立hello.py:

 

#!/usr/bin/python
print "HTTP/1.0 200 OK"
print "Content-Type:text/html"
print ""
print ""
print "Hello,world!"
print ""

可能你在执行的时候,浏览器里面显示为空,再看在server端的提示:

Traceback (most recent call last):
  File "/usr/lib/python2.5/CGIHTTPServer.py", line 251, in run_cgi
    os.execve(scriptfile, args, os.environ)
OSError: [Errno 13] Permission denied
应该是权限问题.最简单的方法是将整个cgi-bin目录权限改为最大: chmod -R 777 cgi-bin.再次执行,一切OK!

阅读(1345) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-14 14:39:45

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com

chinaunix网友2010-09-14 14:39:45

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com