现在的位置: 首页 > 综合 > 正文

socket通信模拟http服务之python版

2012年11月11日 ⁄ 综合 ⁄ 共 2343字 ⁄ 字号 评论关闭

直接见代码,用python编写一个基于socket的c/S结构程序,然后双方简单模拟http协议通信,也可以直接通过浏览器来访问服务器。

服务器端:
#!/usr/bin/env python  
#encoding: utf-8
import socket, sys, threading
  
SERVER = '127.0.0.1' #主机IP  
PORT = 8080 #端口号  
MAXTHREADS = 10
RECVBUFLEN = 1024
HTTPTAG = 'HTTP/1.'
MYTAG = '^MyP 1.0'
RSTR = ''''HTTP/1.1 200 OK
Proxy-Connection: Keep-Alive
Connection: Keep-Alive
Content-Length: 8296
Via: 1.1 JA-ISA02
Expires: Fri, 18 May 2012 09:05:56 GMT
Date: Fri, 18 May 2012 09:05:56 GMT
Content-Type: text/html;charset=gb2312
Server: BWS/1.0
Cache-Control: private

test'''
RSTR2 = '''my defined p... '''
RSTR3 = '''unknown p... '''
userlist = ['user01', 'user02']
BADUSER = 'bad'
class Checker(threading.Thread):
    def __init__(self,socket,num):
        threading.Thread.__init__(self)
        self.socket = socket
        self.num = num
        print 'thread started!'

    def run(self):
        while True:
            self.socket.listen(2)
            cs,address = self.socket.accept()
            recvstr = cs.recv(RECVBUFLEN)
            print '>>>>>>>>>>>>thread [%d] received:\r\n%s' % (self.num,recvstr)
            if recvstr == '':
                print 'empty request'
                cs.close()
                return
            TAG = recvstr.split('\r\n', 1)[0]
            if HTTPTAG in TAG:
                print 'HTTP Request'
                cs.send(RSTR)
                print 'response is: \r\n%s' % RSTR
            elif MYTAG in TAG:
                print 'My define Request'
                cs.send(RSTR2)
                print 'response is: \r\n%s' % RSTR2
            else:
                print 'other request'
                cs.send(RSTR3)
                print 'response is: \r\n%s' % RSTR3
            print '>>>>>>>>>>>>thread [%d] end check>>>>>>>>>>>>' % (self.num,)
            cs.close()


class authServer(object):
    def __init__(self):
        self.socket = None
    def run(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.bind((SERVER,PORT))
        i = 0
        chkerlist = []
        while i<MAXTHREADS:
            chker = Checker(self.socket,i)
            chker.start()
            i = i + 1
            chkerlist.append(chker)
        for chker in chkerlist:
            chker.join()

if __name__ == '__main__':
    asvr = authServer()
    asvr.run()
    print 'ending'
    

客户端:

#!/usr/bin/env python  
#encoding: utf-8
import socket, threading  

SERVER = '127.0.0.1' #主机IP  
PORT = 8080 #端口号
START = '^MyP 1.0' 
START2 = '^MyP 1.0' 
START3 = '[^st]' 
BUFLEN = 1024 
USER_list = ['user01', 'user02']

class connector(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self)
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.num = num

    def run(self):
        try:
            self.sock.connect((SERVER,PORT))
            self.sock.send(START)
            print '>>>>>sent ',START            
            rstr = self.sock.recv(BUFLEN)
            print 'received>>>>>>>',rstr
            self.sock.close()
            return
        except socket.error,e:
            print e
            return

if __name__ == '__main__':
    cnlist = []
    i = 0
    while i<10:
        cn = connector(i)
        cn.start()
        cnlist.append(cn)
        i = i + 1
    for cn in cnlist:
        cn.join()

服务器端对请求的内容进行简单分析,符合http格式的就提示为http请求并返回http格式的字符串,所有线程都是短连接,一应一答即结束,可以说是模拟了http请求的方式。

抱歉!评论已关闭.