- 论坛徽章:
- 0
|
我希望实现一个使用socket的TCP客户端:
1.在实现注册后,每隔一段时间发送一个心跳包
2.在收到一个命令(该命令为往某一IP的固定端口发送数据包)
希望能够两者相互执行时不会相互干扰,但是我现在实现的代码,只执行一个单线程(RecvCMD或是SendHeart)时没问题,两个一起执行时,发送心跳时,第2条发送数据包的线程被挂起了。请问要怎样解决,谢谢
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)
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(204
#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.s,self.clientID,self.MAC)
t2=SendHeart(self.s)
#t1.setDaemon(1)
t1.start()
#t2.setDaemon(1)
t2.start()
class RecvCMD(threading.Thread):
def __init__(self,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= threading.Event()
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(204
if len(buf)>0:sockbuffer =buf
if self.isSendAddr(sockbuffer) ==True:
package_sendAddr= frame_structure.sendAddr()
self.sock.send(package_sendAddr)
elif self.isSendVideo(sockbuffer) ==True:
host = frame_structure.getIP(buf[10:14])
port = int(binascii.b2a_hex(buf[14:16]), 16)
strIPport=buf[10:16]
MID =buf[2:10]
if len(sockbuffer)==16:
buf = self.sock.recv(204
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.17)
try:
buf = self.sock.recv(204
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)
class SendHeart(threading.Thread):
def __init__(self,sock):
self.sock=sock
threading.Thread.__init__(self)
self.ControlEvent= threading.Event()
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()
if CUR_TIMING - TSTART > 15:
TSTART = CUR_TIMING
self.sendHeartBeat()
time.sleep(1) |
|