首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

关于python socket 主动关闭链接 的有关问题

2013-04-12 
关于python socket 主动关闭链接 的问题我client端先发送12个字节长度的固定传, 然后再发送24个字节的 字

关于python socket 主动关闭链接 的问题
我client端先发送12个字节长度的固定传, 然后再发送24个字节的 字符串, server端第一次接收是正确的, 也返回给client端数据了, 可第二次client发送数据的时候, 就发送不过去了, server端也没反应, 什么数据也没收到, 请各位达人帮忙看下, 我怀疑是server端主动关闭链接了, 如何让server端不关闭链接呢 多谢

代码如下, 麻烦看下怎么解决, 多谢:


import socket
import select
import sys
import struct

HeaderFormat = "!8sI*1s"
IP = '192.168.0.101'
PORT = 10086

def sendAll(sock, packet, timeout= -1):
    
    if timeout < 0:
        timeout = 10
    try:
        size = 0
        while size < len(packet):
            if len(select.select([], [sock, ], [], timeout)[1]) <= 0:
                return False
            thesize = sock.send(packet[size:])
            if thesize <= 0:
                return False
            size += thesize
        return True
    except:
        return False

def recvAll(sock, size, timeout= -1):
    
    if timeout < 0:
        timeout = RecvTimeout
    try:
        res = ""
        while size > len(res):
            if len(select.select([sock, ], [], [], timeout)[0]) <= 0:
                return False
            buff = sock.recv(size - len(res))
            if len(buff) <= 0:
                return False
            res += buff
        return res
    except:
        return False

if __name__ == '__main__':
    
    #socket.setdefaulttimeout(timeout)
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
    #sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((IP, PORT))  
    sock.listen(5)  
    
    while True:  
        try:
            usock,address = sock.accept() 


        except socket.error, e:    
            print 'Strange error begin to accept:%s' % e 
            continue
         
        try:  
            rcv_header = ''
            
            RecvHeaderFormat = "!8sI"
            HeaderSize = 12
            
            BodyFormat = "!*1s"
            recv_body = ''
            
            rcv_header = recvAll(usock, HeaderSize)
            if rcv_header == False :
                print 'recv header err'
                usock.close()
                continue
            h_sign, body_size = struct.unpack(RecvHeaderFormat, rcv_header)
            recv_body = recvAll(usock, body_size)
            if recv_body == False:
                print 'recv body err'
                usock.close()
                continue
            
            recv_body = struct.unpack(createFormat(BodyFormat, body_size), recv_body)
            s_hder = 'VIDEOLOG'
            u_data = 'adsfjlsjdlfjsldjflsdjflsjdflj'
            s_body_len = len(u_data)
            
            packet = struct.pack(createFormat(HeaderFormat, s_body_len), s_hder, s_body_len, u_data)
            if not sendAll(usock, packet):
                print 'send data to network server failed'
                continue
        except:  
            print 'recv error'


        
        continue



每次server端先接收 头部信息, 然后取出后面的 消息体的长度, 再接收消息体的信息, 每次都是这样循环. 就是第一次行, 后面就不行了, 不知道什么原因
[解决办法]
貌似处理了2次recvAll()后又重新等待连接了
[解决办法]
一楼的意思是说,循环一轮又重新usock,address = sock.accept() 阻塞在这里了,所以你的客户端要重新连接,而不是继续发数据,或者accept后,再写个while循环,这样才能不断响应同一个连接...
[解决办法]
en 
            usock,address = sock.accept()  
2次recvAll后又阻塞在上面这个函数这里了

热点排行