Python Echo服务器聊天应用程序在连接时出现问题
在网络方面,我是一个新手,但对于我的分布式系统项目,我正在尝试创建一个简单的应用程序,允许使用python的同一网络上的任何计算机向服务器发送消息。我无法成功连接我的计算机和笔记本电脑,客户端出现超时错误: 这是我的服务器代码:Python Echo服务器聊天应用程序在连接时出现问题,python,sockets,networking,network-programming,echo,Python,Sockets,Networking,Network Programming,Echo,在网络方面,我是一个新手,但对于我的分布式系统项目,我正在尝试创建一个简单的应用程序,允许使用python的同一网络上的任何计算机向服务器发送消息。我无法成功连接我的计算机和笔记本电脑,客户端出现超时错误: 这是我的服务器代码: import socket import select HEADER_LENGTH = 10 IP = "127.0.0.1" PORT = 1234 server_socket = socket.socket(socket.AF_INET, s
import socket
import select
HEADER_LENGTH = 10
IP = "127.0.0.1"
PORT = 1234
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((IP, PORT))
server_socket.listen()
sockets_list = [server_socket]
clients = {}
def receive_message(client_socket):
try:
message_header = client_socket.recv(HEADER_LENGTH)
if not len(message_header):
return False
message_length = int(message_header.decode("utf-8").strip())
return {"header": message_header, "data" : client_socket.recv(message_length)}
except:
return False
while True:
read_sockets, _, exception_sockets = select.select(sockets_list, [], sockets_list)
for notified_socket in read_sockets:
if notified_socket == server_socket:
client_socket, client_address = server_socket.accept()
user = receive_message(client_socket)
if user is False:
continue
sockets_list.append(client_socket)
clients[client_socket] = user
print(f"Accepted new connection from {client_address[0]}:{client_address[1]} username:{user['data'].decode('utf-8')}")
else:
message = receive_message(notified_socket)
if message is False:
print(f"Closed connection from {clients[notified_socket]['data'].decode('utf-8')}")
sockets_list.remove(notified_socket)
del clients[notified_socket]
continue
user = clients[notified_socket]
print(f"Received message from {user['data'].decode('utf-8')}: {message['data'].decode('utf-8')}")
for client_socket in clients:
if client_socket != notified_socket:
client_socket.send(user['header'] + user['data'] + message['header'] + message['data'])
for notified_socket in exception_sockets:
sockets_list.remove(notified_socket)
del clients[notified_socket]
这是我的客户代码
import socket
import select
import errno
import sys
HEADER_LENGTH = 10
IP = "127.0.0.1"
PORT = 1234
my_username = input("Username: ")
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((IP, PORT))
client_socket.setblocking(False)
username = my_username.encode("utf-8")
username_header = f"{len(username):<{HEADER_LENGTH}}".encode("utf-8")
client_socket.send(username_header + username)
while True:
message = input(f"{my_username} > ")
if message:
message = message.encode("utf-8")
message_header = f"{len(message):<{HEADER_LENGTH}}".encode("utf-8")
client_socket.send(message_header + message)
try:
while True:
#receive things
username_header = client_socket.recv(HEADER_LENGTH)
if not len(username_header):
print("connection closed by the server")
sys.exit()
username_length = int(username_header.decode("utf-8").strip())
username = client_socket.recv(username_length).decode("utf-8")
message_header = client_socket.recv(HEADER_LENGTH)
message_length = int(message_header.decode("utf-8").strip())
message = client_socket.recv(message_length).decode("utf-8")
print(f"{username} > {message}")
except IOError as e:
if e.errno != errno.EAGAIN and e.errno != errno.EWOULDBLOCK:
print('Reading error', str(e))
sys.exit()
continue
except Exception as e:
print('General error', str(e))
sys.exit()
导入套接字
导入选择
输入错误号
导入系统
标题长度=10
IP=“127.0.0.1”
端口=1234
我的用户名=输入(“用户名:”)
client\u socket=socket.socket(socket.AF\u INET,socket.SOCK\u流)
客户端_套接字连接((IP,端口))
客户端\u套接字锁定(错误)
用户名=我的用户名。编码(“utf-8”)
用户名\头=f“{len(用户名):”)
如果消息:
消息=消息编码(“utf-8”)
消息头=f“{len(消息):{message}”)
除IOE错误外:
如果e.errno!=errno.EAGAIN和e.errno!=errno.ewoldblock:
打印('读取错误',str(e))
sys.exit()
持续
例外情况除外,如e:
打印('一般错误',str(e))
sys.exit()
在同一台机器上,由于我对服务器和客户端都使用了主机名,所以它可以正常工作,但显然,它不能在单独的设备上工作
如何更改此代码,以便使我的笔记本电脑充当客户端,使我的计算机充当服务器?我只需要连接到同一网络上的设备。谢谢您的回答。我自己找到了解决方案,我只需将客户端中的“IP”设置为服务器本地IP的“IP”,最后在空闲状态下运行这两个设备,以便获得prompt绕过防火墙,因为我之前运行的是cmd,没有得到绕过的选项