关于python 多线程客户端的问题
发表于 : 2012-02-27 16:04
希望实现一个如下的客户端:
1.在登录上服务器后,每隔15秒钟发送一个心跳包
2.在接收到服务器的发送数据包的命令后,将本地的图像按照私有协议进行发送
结果发现发送心跳后,正在传送的数据包就没继续传了,请高手指导,谢谢
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)