插座,通讯停止

时间:2011-01-18 23:14:42

标签: python sockets client

我有一个关于套接字编程的简单问题。我已经完成了以下代码实现服务器和两个客户端,但突然间它在相互通信时停止。我不知道为什么会一直这样。

你能给我建议,提示或帮助吗? 谢谢你的时间。

客户端

# simple client

import socket
import sys

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = ""
port = 12345

buf = 100

s.connect((host, port))
i = 0

timestep = 0

while(1):
    k = '01'#+str(timestep)
    #1
    s.send(k)
    print 'sending message is', k

    #2
    v = s.recv(buf)
    print v

    if v == 'hold 01':
        print 'timestep is', timestep#'send the previous message'
        if timestep == 0:
            timestep == 0
        else:
            timestep -= 1
    else:
        print 'read data'
        FILE = open("datainfo1.txt", "r+")
        msg = FILE.read()
        FILE.close()

        #3
        while(1):
            tmp, msg = msg[:buf], msg[buf:]

            s.send(tmp)

            print len(tmp)

            if len(tmp) < buf:
                print 'break'
                break
        # send file
    i+=1
    timestep+=1
print 'end'
s.close()

服务器

import socket, sys 

# set up listening socket 
lstn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = ""
port = 12345

# bind lstn socket to this port 
lstn.bind(("", port)) 
lstn.listen(5) 

# initialize buffer size
buf = 100

# initialize concatenate string, v 
v = ''

# initialize client socket list 
cs = [] 
check = [0, 0]

# a fixed number of clients
nc = 1 

count = 0
status = [0,0]
j = 0
step = [0,0]

for i in range(nc): 
    (clnt,ap) = lstn.accept() 
    clnt.setblocking(0) 
    cs.append(clnt) 


file = open("output_analysis.txt","w+")

while (len(cs) > 0): 
    clnt = cs.pop(0) 
    cs.append(clnt) 

    try: 
        #1
        k = clnt.recv(buf)  
        print "k=",k,"\n"#[:2]  
        if k == '01':
            print "1st client connected", status[0]
            file.write("1st\t") 

            if status[0] == 0:
                v = 'hold 01'
                check[0] = 1
            elif status[0] == 1:
                v = 'go 01'
                # status[0] = 0

            print v, "the message\n"

            file.write(v)
            file.write("\t")
            #2
            clnt.send(v) 

            if status[0] == 1:

                FILE = open("client1.txt","w+")
                print 'receive 01'
                #3
                while(1):
                    status[0] = 0
                    print '1st : receiving'
                    msg = clnt.recv(buf)
                    print len(msg)

                    if len(msg) < buf:
                        print 'break'
                        #FILE.close()
                        break 



        elif k == '02':
            print "2nd client connected", status[0]
            file.write("2nd\t") 

            if status[1] == 0:
                v = 'hold 02'
                check[1] = 1
            elif status[1] == 1:
                v = 'go 02'
                # status[0] = 0

            print v, "the message\n"

            file.write(v)
            file.write("\t")
            #2
            clnt.send(v) 

            if status[1] == 1:

                FILE = open("client2.txt","w+")
                print 'receive 02'
                #3
                while(1):
                    status[1] = 0
                    print '2nd : receiving'
                    msg = clnt.recv(buf)
                    print len(msg)

                    if len(msg) < buf:
                        print 'break'
                        #FILE.close()
                        break 

        if check[0] == 1:# and check[1] == 1:
            print j, 'here\n'
            j += 1
            for i in range(2):
                check[i] = 0
                status[i] = 1 # which means, all clients are connected
            print check, status
        else:
            print 'hello'

    except: pass 

file.close()
lstn.close() 

2 个答案:

答案 0 :(得分:3)

except: pass

你忽略了所有异常。这是一个坏主意,因为它不会让你知道什么时候出错。在合理调试代码之前,您需要删除except处理程序。

答案 1 :(得分:2)

一个问题是您正在设置非阻止模式:

  

clnt.setblocking(0)

但永远不要检查发送或recv数据是否安全。事实证明,由于代码忽略了所有异常,因此在删除try时没有看到以下错误:

  

异常[Errno 10035]无法立即完成非阻塞套接字操作

删除setblocking电话后,代码继续进行,但仍有问题。

描述您尝试解决的问题将有助于理解代码尝试执行的操作。