2017-06-10 5 views
0

私は現在プロジェクトを進めており、socket(python)を使う必要があります。私の問題は: - クライアントが切断すると、私のサーバーも切断されます。しかし、私はこれを望んでいません。私はサーバーが常に生き続けることを望んでいます。どうすればいいのですか?クライアントの切断時にサーバを開いたままにする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"を送信するとき。クライアントのループが停止したときと、サーバーのループが停止したときです。クライアントが"fin"を送信するときserveur_lanceの値を変更し、あなたが投稿したコード内で唯一のものは次のとおりです。クライアントへの

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

だから、瞬間誰かの種類finは、サーバは、コマンドを停止するようになります。

サーバコードのserveur_lanceの値を変更する代わりに、特定の接続を閉じてclients_connectesリストから削除することをお勧めします。

関連する問題