2010-08-27 63 views
0
我的程序冻结

所以,这里是一些代码:为什么当我听插座

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:怎么那么可以对其进行修复?

+0

什么是'obj'?该计划尚未完成。另外,你不要关闭你的套接字。 – extraneon 2010-08-27 17:11:32

+0

obj只是与sone信息类,如主机或端口。 当程序冻结时关闭套接字是否非常重要? – vladimar 2010-08-27 17:13:31

+0

没有一个完整的程序,我无法测试它。我不经常使用套接字,以至于我只能看到错误:) – extraneon 2010-08-27 17:25:57

回答

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是一个阻塞调用和将阻塞,直到它从服务器接收某些数据。这可能是你冻结的原因。

+0

并且如果我想创建一个应用程序,应该经常检查服务器上的新信息? – vladimar 2010-08-27 17:50:29