为什么我的程序在监听套接字时冻结?

0 投票
1 回答
1981 浏览
提问于 2025-04-16 03:24

这里有一些代码:

obj.HOST = ""
obj.PORT = int(port.get()) # it's 100% correct PORT number
obj.srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
obj.srv.bind((obj.HOST, obj.PORT))
obj.srv.listen(1)
obj.sock, obj.addr = obj.srv.accept()

class Client(threading.Thread):
     def __init__(self,from_):
        if from_.ip.get() == '':
            obj.HOST = 'localhost' # I am starting both programs from 1 computer, so it's 'localhost'
        else:
            obj.HOST = from_.ip.get()
        obj.PORT = int(from_.port.get()) # it's 100% correct PORT number (the same as previous)
        obj.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        obj.sock.connect((obj.HOST, obj.PORT))
        threading.Thread.__init__(self)
     def run(self):
        command = obj.sock.recv(1024)
        print command
        if command == 'confirm':
            print 'confirm'
        elif command == 'start':
            print 'start'

client = Client(cl) # cl is class, where I get port. It's works 100% correct
client.start()

我在我的电脑上启动了同一个程序。一个是主机,另一个是客户端。

问题 1:当我在等待连接时,我的服务器脚本卡住了。怎么解决这个问题?

在连接后,两个程序都能正常工作,但当服务器发送一些信息(字符串)时,客户端脚本又卡住了。

问题 2:那这个问题该怎么修复呢?

1 个回答

0

不太清楚你提到的obj是什么。

不过,你并没有从服务器发送任何东西到客户端。

在服务器端,你可以这样做:

conn, addr = srv.accept()
print 'Connected by', addr
conn.send("confirm")
conn.close()

这样做会接受一个连接,发送一些数据“确认”,然后关闭连接并退出。

客户端的做法也是类似的:

def run(self):
        command = self.sock.recv(1024)
        print command
        print "Recieved : ", command
        self.sock.close()

这段代码会连接到服务器,接收一些数据,打印出来,然后关闭连接。

recv是一个阻塞调用,它会一直等到从服务器接收到一些数据才会继续执行。这可能就是你程序卡住的原因。

撰写回答