免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4687 | 回复: 2
打印 上一主题 下一主题

关于python socket多线程的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-27 14:32 |只看该作者 |倒序浏览
我希望实现一个使用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)

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [报告]
发表于 2012-02-27 14:37 |只看该作者
请把代码用code标签括起来,给他人节省点时间和精力!

论坛徽章:
0
3 [报告]
发表于 2012-02-27 14:44 |只看该作者
threading_socket.rar (1.8 KB, 下载次数: 69) 源文件已经附上
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP