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