# -*- coding: utf-8 -*-
#!/usr/bin/env python

import SocketServer
from SocketServer import StreamRequestHandler as SRH
from time import ctime
import struct
import json
import urllib
import urllib2
import socket
import time
import traceback

import threading
import globalres

host = ''
port = 5004
addr = (host,port)

url = 'http://yoururl'

'''
First, you must create a request handler class by subclassing the BaseRequestHandler class
and overriding its handle() method;
this method will process incoming requests.
'''
class TcpNetHandler(SRH):
def handle(self):
print '[server] got connection from ',self.client_address
#self.wfile.write('connection %s:%s at %s succeed!' % (host,port,ctime()))
old_buf = ''
new_buf = ''
all_buf = ''
while True:
try:
new_buf = self.request.recv(1024*1024)
if not new_buf:
print '[server] lost connection from ',self.client_address
break
all_buf = old_buf + new_buf
if len(all_buf) < 16 :
continue
processedlen=self.processRecvdBuffer(all_buf)
if -1 == processedlen :
break
remain_len = len(all_buf)
if remain_len > processedlen :
old_buf = all_buf[processedlen:]
print "[server] process:%d ,remain:%d"%(processedlen,remain_len)
#print "[server] finish once"
except:
print 'error in ThreadedTCPRequestHandler :%s' % (traceback.format_exc())
#return
def processRecvdBuffer(self,recvbuf):
processedlen = 0
total_len= len(recvbuf)
remain_buf = recvbuf
while True :
(retcode,size,cmd) = self.unpackFromBuffer(remain_buf)
if -1 == retcode :
print '[server] unpackFromBuffer error: ',retcode
return -1
if 0 == retcode :
print '[server] next time again'
break
netpacket = remain_buf[:size]
if cmd == 0:
print "[server] client-keeplive,from:",self.client_address
self.request.send(netpacket)
elif cmd == 102:
globalres.netpackqueue.put(netpacket)
#print "102"
pass
else :
print "other ",cmd
processedlen = processedlen+size
if processedlen >=total_len :
break
remain_buf=remain_buf[size:]
pass
return processedlen
'''
retcode : -1,failed;0,next time again;1,success,
'''
def unpackFromBuffer(self,bytebuf1):
packet_header = bytebuf1[:16]
(size,cmd,subcmd,magic,version)=struct.unpack('IHHII',packet_header)
if cmd == 0 and size==16:
#print "[server] client-keeplive"
self.request.send(packet_header)
return (1,16,0)
if size < 16 or size > 4096:
print "[server] invalid size",size
return (-1,-1,cmd)
if len(bytebuf1) < size:
print "[server] buf not enough",len(bytebuf1),size
return (0,0,cmd)
return (1,size,cmd)


class HttpRequestThread(threading.Thread):
def __init__(self, queue,htint):
threading.Thread.__init__(self)
self.queue = queue
self.Ht=htint #线程ID
def run(self):
while True:
if self.queue.empty() :
time.sleep(0.01)
continue
netpacket = self.queue.get()
#print "[Thread%d] get from qsize:%d "%(self.Ht,self.queue.qsize())
try:
self.processNetPacket(0,netpacket)
finally:
self.queue.task_done()
def processNetPacket(self,cmd,netpacket):
self.process_cmd102_post_pushmsg(netpacket)
#print "[server] dispatchNetPacket",(cmd,netpacket,netpacksize)
#if cmd==102 :
# self.process_cmd102_post_pushmsg(netpacket)
# pass
#else:
# print "[server] invalid cmd:",cmd
# pass
def process_cmd102_post_pushmsg(self,netpacket):
data = netpacket[16:]
datasize = len(netpacket) -16
msgsize = datasize - 26
#fmtstr = "QQQH%ds"%(msgsize)
print "[Thread%d] fmtstr:%s"%(self.Ht,fmtstr)
(groupid,memberid,senderid,devicetype,message)=struct.unpack(fmtstr,data)
#print "[server] fmtstr unpack:", (groupid,memberid,senderid,devicetype,message)
dict1=dict()
dict1["groupid"]=groupid
dict1["memberid"]=memberid
dict1["devicetype"]=devicetype
dict1["message"]=message
content = urllib.urlencode(dict1)
print "[Thread%d] urlencode content:%s"%(self.Ht,content)
urllib2.socket.setdefaulttimeout(5)
request = urllib2.Request(url, content)
response = urllib2.urlopen(request)
page = response.read()
print "[Thread%d] response:%s"%( self.Ht,page.decode("utf-8") )
pass

def prepareWorkThreadPoll():
print "[server] prepareWorkThreadPoll"
for i in range(4):
t = HttpRequestThread(globalres.netpackqueue,i)
t.setDaemon(True)
t.start()
print "[server] startthread:",i
'''
Second, you must instantiate one of the server classes, passing it the server’s address
and the request handler class.
Finally, call the handle_request() or serve_forever() method of the server
object to process one or many requests.
'''
def main():
prepareWorkThreadPoll()
server = SocketServer.ThreadingTCPServer(addr,TcpNetHandler)
print 'server is running in port %d .'%(port)
server.serve_forever()
pass

main()
#test(buf)



#data=buf
#print buf
#dict1 = json.loads(data)
#print "load dict:",type(dict1),dict1
|