套接字,通信中断

0 投票
2 回答
1574 浏览
提问于 2025-04-16 10:12

我有一个关于套接字编程的简单问题。我已经实现了一个服务器和两个客户端,代码如下,但它们在相互通信时突然停止了。我不知道为什么总是会发生这种情况。

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

客户端

# 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 个回答

2

一个问题是你设置了非阻塞模式:

clnt.setblocking(0)

但是你从来没有检查过发送或接收数据是否安全。结果是,因为代码忽略了所有的异常,所以没有看到我在去掉尝试部分后遇到的以下错误:

异常 [错误号 10035] 一个非阻塞的套接字操作无法立即完成

在去掉了 setblocking 的调用后,代码继续执行,但仍然存在问题。

描述一下你想解决的问题会有助于理解这段代码的目的。

3
except: pass

你现在忽略了所有的错误。这其实不好,因为这样你就不知道什么时候出问题了。在你想要好好调试代码之前,得把那个 except 处理器去掉。

撰写回答