2017-05-17 523 views
0

私はクライアントベースのチャットクライアントを作成しています。サーバとクライアントを設定するたびに、クライアントはこのエラーを接続しようとします[WinError 10054] An existing connection was forcibly closed by the remote hostが表示されますが、サーバーは引き続き接続を待機します。お使いのサーバがローカルネットワーク上にない場合、私は必ずポート7999が開いていることを確認し、Pythonのバージョン3.6.1Python:[WinError 10054]既存の接続がリモートホストによって強制的にクローズされました

スクリプト

import socket 
import threading 

clients = [] 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 

mode = input("Enter 1 for server mode and enter 2 for client mode") 
if mode == "1": 

    def get_ip(): 
     try: 
      stest = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
      stest.connect(('10.255.255.255', 1)) 
      IP = stest.getsockname()[0] 
     except: 
      IP = '127.0.0.1' 
     finally: 
      stest.close() 
     return IP 
    print("IP: " + get_ip()) 
    s.bind((get_ip(), 7999)) 
    s.setblocking(0) 

    print("Waiting for connection") 
    while True: 
     try: 
      data, addr = s.recvfrom(1024) 
      if data.decode() == "Quit": 
       quitmsg = str(addr) + " has quit the chat." 
       clients.remove(addr) 
       for client in clients: 
        s.sendto(quitmsg.encode("utf-8"), client) 
       break 
      elif data: 
       print(data) 
       if addr not in clients: 
        clients.append(addr) 
        print(clients[0]) 
       for client in clients: 
        print(client) 
        s.sendto(data, client) 
     except: 
      pass 
     s.close() 


elif mode == "2": 
    while True: 
     try: 
      ip = input("Enter in an ip address") 
      socket.inet_aton(ip) 
     except socket.error: 
      print("Invalid IPv4 address") 
      continue 
     while True: 
      try: 
       port = int(input("Enter in port number")) 
      except ValueError: 
       print("Invalid Port Number") 
       continue 
      break 
     addr = (ip, port) 
     break 
    s.connect(addr) 

    def recvmsg(): 
     while True: 
      data = s.recv(1024) 
      print(data) 
      if data: 
       print(data.decode()) 

    recv = threading.Thread(name="recvmsg", target=recvmsg) 
    recv.daemon = True 
    recv.start() 

    while True: 
     string = input(">>") 
     s.send(string.encode("utf-8")) 
     if str(string) == "Quit": 
      break 

    s.close() 
    print("Disconnected from chat") 

Server Waiting For connection even after client can't connect

Client Failed to connect

答えて

0

を使用していますし、アクセスポイントで転送されます。そうしないと、パケットはルータによって廃棄されます。ローカルネットワーク上にある場合は、転送を試みます。また、https://www.speedguide.net/port.php?port=7999によれば、ポートはワームによって使用されているので、他のネットワーク上で永久に閉じられている可能性がありますか?可能性は低いですが。

+0

私はルータがAP分離モードにあると思っていましたが、ループバックインターフェイス127.0.0.1で試してみましたが、同じ応答がありました。 – Kozero

+0

ええと、ファイアウォールの問題かもしれませんか?ログを見てみる – pointerless

+0

私は、クライアントとサーバーの両方の機能が別々のスクリプトにあっても正常に動作しているとは思わない。また、同じスクリプトの2つの異なるインスタンスを実行します。 – Kozero

関連する問題