首页 > 解决方案 > 尝试运行程序时引发 ConnectionRefusedError

问题描述

我用 python 建立了一个聊天室,这样我就可以用不同的方式与我的朋友交谈,但由于某种原因,我的朋友收到了 ConnectionRefusedError。我有一个 server.py 文件和一个 client.py 文件。client.py 文件完全相同,但是我的朋友是唯一得到错误的人,但不是我。我不知道我在哪里犯了错误,所以这是两个文件的代码:

服务器.py

import threading
import socket

host = "127.0.0.1" #localhost
port = 48812

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()

clients = []
nicknames = []

def broadcast(message):
    for client in clients:
        client.send(message)

def handle(client):
    while True:
        try:
            message = client.recv(1024)
            broadcast(message)

        except:
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            broadcast(f"{nickname} left the chat".encode('ascii'))
            nicknames.remove(nickname)
            break
def receive():
    while True:
        client, address = server.accept()
        print(f"Connected with{str(address)}")

        client.send("NICK".encode("ascii"))
        nickname = client.recv(1024).decode('ascii')
        nicknames.append(nickname)
        clients.append(client)

        print(f"Nickname of client is {nickname}\n")
        broadcast(f'{nickname}joined the chat!\n'.encode('ascii'))
        client.send("Connected to the server!\n".encode('ascii'))

        thread = threading.Thread(target=handle, args=(client,))
        thread.start()


print("Server is listening...")
receive()

客户端.py

import socket
import threading

nickname = input("Choose a nickname: ")

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 48812))

def receive():
    while True:
        try:
            message = client.recv(1024).decode('ascii')
            if message == 'NICK':
                pass
            else:
                print(message)

        except:
            print("An error occurred!")
            client.close()
            break


def write():
    while True:
        message = f'{nickname}: {input("")}'
        client.send(message.encode('ascii'))


receive_thread = threading.Thread(target=receive)
receive_thread.start()

write_thread = threading.Thread(target=write)
write_thread.start()

我们连接到同一个wifi,所以我认为它应该可以工作。有谁知道如何解决这一问题?

标签: pythonpython-3.xsockets

解决方案


IP 地址127.0.0.1是本地主机(或“环回”地址),它是您自己计算机的地址。有了它,您可以在同一台计算机上运行服务器和客户端,但不能从不同的计算机连接到服务器。

即使您在同一个 WiFi 上,您仍然有不同的 IP 地址。每个连接到互联网的设备都需要一个不与其他地址冲突的 IP 地址。基本上,路由器通过公共IP 地址连接到“大”互联网,并且可以与世界各地的其他设备通信。然后,您的路由器一侧有一个“小型”互联网,您的计算机、电话、智能电视等都连接在该互联网上。这些都具有私有地址,即仅在路由器网络内唯一的地址。

为了使您的服务器正常工作,它需要侦听所有 IP 地址(或客户端的私有IP 地址,这很可能类似于192.168.1.XX 是某个数字的位置)。您可以通过绑定来收听所有地址0.0.0.0

为了让您的客户端正常工作,您需要连接到服务器的私有IP 地址。

如何找到它取决于您的操作系统,但通常在系统设置或首选项中。如果您有 Mac OS,则可以在按住 alt 键的同时单击 WiFi 图标。


推荐阅读