提问人:Daniel Bruton 提问时间:11/16/2023 最后编辑:JonasDaniel Bruton 更新时间:11/20/2023 访问量:9
Python 服务器-客户端消息传递
Python Server-Client Messaging
问:
我正在尝试使用 Python 套接字来构建服务器-客户端聊天系统。我遇到的问题是,在机器本身发送消息之前,不会显示任何消息,然后显示它收到的所有消息。我知道这段代码中还有其他问题,并且绝对欢迎其他指针,但我主要专注于找到一种方法来修复此错误,因为我根本没有运气。 我的代码如下。
服务器:
import socket
from threading import *
HOSTNAME = socket.gethostname()
HOST = socket.gethostbyname(HOSTNAME)
PORT = 4141
clients = []
client_num = 0
PORTS_ARRAY = [4141,4142]
print(f"Server {HOST} online")
class Connection():
def __init__(self):
self.sock = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
self.port = PORTS_ARRAY[0]
PORTS_ARRAY.pop(0)
print(f"[.] Binding server listener to port {self.port}...")
self.sock.bind((HOST , self.port))
print("[.] Listener bind successful! Starting listener service...")
self.sock.listen()
self.client = ""
self.address = ""
while not self.client and not self.address:
self.client,self.address = self.sock.accept()
print(f"[+] Client {self.address[0]}:str({self.address[1]}) has connected to server")
self.client.send(f"[+] Connection request accepted by server {HOST}".encode("utf-8"))
clients.append([self.address[0],self.address[1]])
def close_connection(self):
try:
self.sock.shutdown(socket.SHUT_RDWR)
self.sock.close()
except:
print(f"[-] Client {self.address} has disconnected")
PORTS_ARRAY.append(self.port)
def message_client(self, message):
self.client.send(f"Message from server {HOST} : {message}".encode("utf-8"))
def port_listen(self):
while True:
server_message = input()
if server_message:
self.message_client(server_message.encode("utf-8"))
try:
message = self.client.recv(4096).decode("utf-8")
except:
self.close_connection()
if message == "/BYE":
self.close_connection()
break
elif message == "/ONLINE":
print(clients)
else:
print(f"[IN] Message from client {self.address[0]}:{self.address[1]} : {message}")
client_one = Connection()
c1_listener = Thread(target=client_one.port_listen, daemon=True)
c1_listener.start()
client_two = Connection()
c2_listener = Thread(target=client_two.port_listen, daemon=True)
c2_listener.start()
while True:
message = input()
for user in [client_one, client_two]:
user.message_client(message)
客户
import socket
from threading import *
import time
SERVER = input("Server IP address: ")
CLIENT_NAME = socket.gethostname()
CLIENT = socket.gethostbyname(CLIENT_NAME)
s = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
s.connect((SERVER , 4141))
def listener():
while True:
message = s.recv(4096)
print(f"[IN] Server: {s.recv(4096).decode('utf-8')}")
message = "";
# server confirmation message
print(s.recv(4096).decode("utf-8"))
listener_daemon = Thread(target=listener, daemon=True)
listener_daemon.start()
try:
while True:
message = input("You: ")
s.send(message.encode("utf-8"))
if message == "/BYE":
s.shutdown(socket.SHUT_RDWR)
s.close()
print(f"[-] Connection with {SERVER} closed by user")
break
except:
print("Error")
就像我说的,我已经尝试调试它。我假设它陷入了 while 循环,但我在找到循环和解决问题时遇到了麻烦。提前致谢:)
答: 暂无答案
评论