直接见代码,用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请求的方式。