关于python 多线程客户端的问题

软件和网站开发以及相关技术探讨
回复
wafght72
帖子: 1
注册时间: 2012-02-27 15:58

关于python 多线程客户端的问题

#1

帖子 wafght72 » 2012-02-27 16:04

希望实现一个如下的客户端:
1.在登录上服务器后,每隔15秒钟发送一个心跳包
2.在接收到服务器的发送数据包的命令后,将本地的图像按照私有协议进行发送
结果发现发送心跳后,正在传送的数据包就没继续传了,请高手指导,谢谢

代码: 全选

#!/usr/bin/python
# coding=gbk
#将心跳和监测收到的数据包,以及根据收到的命令包进行文件传送
#recv是阻塞方式,因此将
"""
 give a class to do  how to do the course of simple agent
 one to one ,a vir agent to a vir client.stay a list 
"""
import threading
from timeit import default_timer
import time
import frame_structure
import socket
import binascii
import sys
#import pickle 
#import Queue
#import start
class mythread(threading.Thread):
    def __init__(self,sockIPport, i):
        self.sockIPport = sockIPport 
        self.clientID =""
        threading.Thread.__init__(self)
        self.ControlEvent= threading.Event()
        self.ControlEvent.set()
        self.setDaemon(1)
        self.MAC=i
    def run(self):
        self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.s.connect(self.sockIPport)
        time.sleep(0.001) 
        #self.s.setblocking(0)#socket 非阻塞方式
        try:
            package_register = frame_structure.resgister(self.MAC)
            self.s.send(package_register)
        except socket.error, e:
            print "Error sending data:%s"%e+"\n"
            sys.exit(0)
        try:
            buf = self.s.recv(2048)
            #buf = self.s.recv(19)
            #self.clientID =buf[3:]
        except socket.error, e:
            sys.exit(0)
        if len(buf)== 19 :
            self.clientID =buf[3:]
            t1=RecvCMD(self.ControlEvent, self.s,self.clientID,self.MAC)
            t2=SendHeart(self.ControlEvent, self.s)
            #t1.setDaemon(1)
            t1.start()
            #t2.setDaemon(1)
            t2.start()
            
class RecvCMD(threading.Thread):   
        def __init__(self,event, sock, clientID, MAC):
            self.clientID=clientID
            self.sock=sock
            self.DIDList =[]
            #self.filename="webcam-00000.jpg"
            self.filename="webcam-"
            threading.Thread.__init__(self)
            self.ControlEvent= event
            #self.ControlEvent= threading.Event()
            #self.ControlEvent= mythread.ControlEvent()
            #self.ControlEvent.set()
            self.setDaemon(1)
            self.MAC=MAC
            self.i =0
            
        def run(self):
            TSTART = 0
            while 1:
                self.ControlEvent.wait()
                sockbuffer =""
                CUR_TIMING = default_timer()
                buf = self.sock.recv(2048)
                if len(buf)>0:sockbuffer =buf
                if self.isSendAddr(sockbuffer) ==True:
                    package_sendAddr= frame_structure.sendAddr()
                    self.sock.send(package_sendAddr)
                    #TSTART=default_timer()
                #elif self.isSendVideo(buf) ==True:
                elif self.isSendVideo(sockbuffer) ==True:
                    self.ControlEvent.set()
                    host = frame_structure.getIP(buf[10:14])
                    port = int(binascii.b2a_hex(buf[14:16]), 16)
                    #port =4103
                    strIPport=buf[10:16]
                    MID =buf[2:10]
                    if len(sockbuffer)==16:
                        buf = self.sock.recv(2048) 
                        if len(buf)>0:sockbuffer =buf
                    elif len(buf)==35:
                        sockbuffer==buf[16:]
                    if self.isSendToCount(sockbuffer) ==True:
                        DID =buf[4:]
                        self.DIDList.append(DID)
                        hostPort =(host, port)
                        self.vs = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
                        self.vs.connect(hostPort)
                        package_VideoInit = frame_structure.sendVideoInit(self.clientID, MID, strIPport,self.MAC)
                        self.vs.send(package_VideoInit)
                        self.SendVideo =True
                        i=0
                        while 1:
                            i=i+1
                            if i>98:i=i-99
                            #if len(self.DIDList)==0: break
                            filename = self.filename+str(i)+".jpg"
                            fp = open(filename,'rb')
                            filedata = fp.read()
                            #time.sleep(0.01)
                            fp.close()
                            #time.sleep(0.01)
                            headData =frame_structure.videoHead(MID, filename, self.DIDList)
                            Packet_Video=headData+filedata
                            self.vs.send(Packet_Video)
                            time.sleep(0.2)
                            try:
                                buf = self.sock.recv(2048)
                                if len(buf)>0:sockbuffer =buf
                                if self.isEndVideo(sockbuffer) ==True:
                                    DID =buf[3:]
                    #if len(self.DIDList)>0:
                                    self.DIDList.remove(DID)
                                    break
                            except socket.error, e:
                                print "Error sending data:%s"%e+"\n"
                        if len(self.DIDList)==0: self.vs.close()
                        TSTART=default_timer()
                        
                #elif self.SendVideo ==True:
                   # self.ControlEvent.wait()
                    #self.sendVideo()
                time.sleep(0.01)
                
        def isSendAddr(self, buf):
            Packet_init =buf
            if len(Packet_init) ==0:return False
            else:
                recv_Init0 = binascii.b2a_hex(Packet_init[0])
                recv_Init1 = binascii.b2a_hex(Packet_init[1])
                if  recv_Init0 == "77" and len(Packet_init) == 2 and recv_Init1 == "a9":
                    return True
                else:
                    return False
        
        def isSendVideo(self, buf):
            Packet_init =buf
            if len(Packet_init) ==0:return False
            else:
                recv_Init0 = binascii.b2a_hex(Packet_init[0])
                recv_Init1 = binascii.b2a_hex(Packet_init[1])
                #if  recv_Init0 == "77" and len(Packet_init) == 16 and recv_Init1 == "22":
                if  recv_Init0 == "77" and recv_Init1 == "22":
                    return True
                else:
                    return False

        def isEndVideo(self, buf):
            Packet_init =buf
            if len(Packet_init) ==0:return False
            else:
                recv_Init0 = binascii.b2a_hex(Packet_init[0])
                recv_Init1 = binascii.b2a_hex(Packet_init[1])
                if  recv_Init0 == "77" and recv_Init1 == "24":
                    return True
                else:
                    return False

        def isSendToCount(self, buf):
            Packet_init =buf
            if len(Packet_init) ==0:return False
            recv_Init0 = binascii.b2a_hex(Packet_init[0])
            recv_Init1 = binascii.b2a_hex(Packet_init[1])
            if  recv_Init0 == "77" and recv_Init1 == "23":
                return True
            else:
                return False
  
class SendHeart(threading.Thread):   
        def __init__(self,event, sock):
            self.sock=sock
            threading.Thread.__init__(self)
            self.ControlEvent= event
            #self.ControlEvent= threading.Event()
            #self.ControlEvent= mythread.ControlEvent()
            #self.ControlEvent.set()
            self.setDaemon(1)
        def sendHeartBeat(self):
            package_heartbeat = frame_structure.heartbeat()
            self.sock.send(package_heartbeat)
        def run(self):
            TSTART = default_timer()
            while 1:           
                self.ControlEvent.wait()
                CUR_TIMING = default_timer()
                self.ControlEvent.set()
                if CUR_TIMING - TSTART > 15 :
                    TSTART = CUR_TIMING
                    self.sendHeartBeat()
                    #self.ControlEvent.clear()
                time.sleep(1) 
回复