2017-06-10 206 views
0

我目前正在一個項目上工作,我需要使用套接字(python)。我的問題是: - 當客戶端斷開連接時,我的服務器也會斷開連接。但我不想要這個。我希望服務器始終保持活躍狀態​​,我該怎麼做?當客戶端斷開連接時保持服務器打開

如果我關閉客戶端,我想在服務器永葆

這裏是我的代碼:

客戶:

import socket 

hote = "localhost" 
port = 12800 

connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
connexion_avec_serveur.connect((hote, port)) 
print("Established {}".format(port)) 

msg_a_envoyer = b"" 
while msg_a_envoyer != b"fin": 
    msg_a_envoyer = input("> ") 
    msg_a_envoyer = msg_a_envoyer.encode() 
    connexion_avec_serveur.send(msg_a_envoyer) 
    msg_recu = connexion_avec_serveur.recv(1024) 
    print(msg_recu.decode()) 

print("Close connection") 
connexion_avec_serveur.close() 

服務器:

import socket 
import select 

hote = '' 
port = 12800 

connexion_principale = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
connexion_principale.bind((hote, port)) 
connexion_principale.listen(5) 
print("rece {}".format(port)) 

serveur_lance = True 
clients_connectes = [] 
while serveur_lance: 
    connexions_demandees, wlist, xlist = select.select([connexion_principale], 
     [], [], 0.05) 

    for connexion in connexions_demandees: 
     connexion_avec_client, infos_connexion = connexion.accept() 
     clients_connectes.append(connexion_avec_client) 

    clients_a_lire = [] 
    try: 
     clients_a_lire, wlist, xlist = select.select(clients_connectes, 
       [], [], 0.05) 
    except select.error: 
     pass 
    else: 
     for client in clients_a_lire: 
      msg_recu = client.recv(1024) 
      msg_recu = msg_recu.decode() 
      print("Recu {}".format(msg_recu)) 
      client.send(b"5/5") 
      if msg_recu == "fin": 
       serveur_lance = False 

請原諒我英語。

感謝您的幫助

+0

它看起來像監聽端口12800 *的服務器*保持活着。 –

回答

0

我懷疑這是不是當客戶端斷開連接,這樣,但是當客戶端發送"fin"。這就是當客戶端的循環停止時,以及當服務器的循環停止時。在改變的serveur_lance值你已經發布的代碼的唯一的事情是當客戶端發送"fin"

while serveur_lance: 
... 
     if msg_recu == "fin": 
      serveur_lance = False 

所以當有人類型fin到客戶端,服務器也將獲得命令停止。

而不是在您的服務器代碼中更改serveur_lance的值,您可能希望關閉該特定連接並將其從clients_connectes列表中刪除。

相關問題