Python:[WinError 10054]现有连接被远程主机强制关闭

问题描述 投票:0回答:1

我正在创建一个基于客户端到服务器的聊天客户端,每次我设置服务器和客户端时,服务器都会继续侦听连接,当客户端尝试连接时会出现此错误

[WinError 10054] An existing connection was forcibly closed by the remote host
,但是服务器仍然侦听一个连接。我正在使用 python 版本 3.6.1

脚本

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

python eclipse python-3.x pydev eclipse-neon
1个回答
0
投票

如果您的服务器不在本地网络上,请确保端口 7999 在其接入点上打开并转发。否则,数据包将被路由器丢弃。如果它在您的本地网络上,仍然尝试转发。另外根据 https://www.speedguide.net/port.php?port=7999 该端口已被蠕虫使用,因此可能在其他网络上永久关闭?不太可能但有可能。

© www.soinside.com 2019 - 2024. All rights reserved.