2010-08-27 58 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