python - 尝试运行程序时引发 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,所以我认为它应该可以工作。有谁知道如何解决这一问题?
解决方案
IP 地址127.0.0.1
是本地主机(或“环回”地址),它是您自己计算机的地址。有了它,您可以在同一台计算机上运行服务器和客户端,但不能从不同的计算机连接到服务器。
即使您在同一个 WiFi 上,您仍然有不同的 IP 地址。每个连接到互联网的设备都需要一个不与其他地址冲突的 IP 地址。基本上,路由器通过公共IP 地址连接到“大”互联网,并且可以与世界各地的其他设备通信。然后,您的路由器一侧有一个“小型”互联网,您的计算机、电话、智能电视等都连接在该互联网上。这些都具有私有地址,即仅在路由器网络内唯一的地址。
为了使您的服务器正常工作,它需要侦听所有 IP 地址(或客户端的私有IP 地址,这很可能类似于192.168.1.X
X 是某个数字的位置)。您可以通过绑定来收听所有地址0.0.0.0
为了让您的客户端正常工作,您需要连接到服务器的私有IP 地址。
如何找到它取决于您的操作系统,但通常在系统设置或首选项中。如果您有 Mac OS,则可以在按住 alt 键的同时单击 WiFi 图标。
推荐阅读
- android - android拖放上的getLocalData仅在真实设备上返回null
- r - hist(add = TRUE) 显示具有相似数据的不同比例
- node.js - 即使函数已被调用,expect(jest.fn()).toHaveBeenCalled() 也会失败
- javascript - 如何防止用户在复制粘贴操作时立即将带有无效字符的文本复制粘贴到输入文本字段中?
- python - 我想知道如何在 Django-Admin 中隐藏模型的创建和修改选项
- html - 如何在不水平扩展的情况下在页面边缘显示一半图像?
- python - 如何在函数中创建参数,使其成为可选参数并拥有无限数量的参数
- unity3d - 无法在谷歌云平台注册应用
- typescript - 限制泛型类型
针对特定类型 - python - 将日期描述解析为日期本身