При отправке сообщения о времени отправки от клиента оно не отправляется другому клиенту.
Я новичок в Python и сокетах. часть прокомментированного кода была кодом, который я пробовал, но не сработал.
Мой код сервера:
import socket
import threading
def handle_client(client_socket):
while True:
data = client_socket.recv(1024)
if not data:
break
message = data.decode('utf-8')
message = str(message)
for i in clients:
i.send(message.encode('utf-8'))
# i.sendall(message.encode('utf-8'))
#i = 0
print(f"Received message: {message}")
#response = "Server received your message: " + message
#client_socket.sendall(response.encode('utf-8'))
# client_socket.close()
def main():
global clients
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 8080
server_socket.bind((host, port))
\# server_socket.listen()
print(f"Server listening on {host}:{port}")
clients = \[\]
names = \[\]
while True:
server_socket.listen()
client_socket, client_address = server_socket.accept()
Username = client_socket.recv(1024).decode('utf-8')
names.append(Username)
clients.append(client_socket)
print(f"Accepted connection from {client_address} with name {Username}")
# print(f"CLIENT SOCKET: {client_socket}")
client_handler = threading.Thread(target=handle_client, args=(client_socket,))
client_handler.start()
if __name__ == "__main__":
main()
Мой клиентский код:
import socket
import threading
def recive():
data = client_socket.recv(1024)
msg = data.decode('utf-8')
print(f"{msg}")
def main():
global client_socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 8080
Username = input('Username: ')
client_socket.connect((host, port))
client_socket.sendall(Username.encode('utf-8'))
recive_handler = threading.Thread(target=recive)
recive_handler.start()
while True:
message = input("Enter your message: ")
client_socket.sendall(message.encode('utf-8'))
if __name__ == "__main__":
main()
Я пробовал менять sendall()
на send()
,
сброс I в цикле for и удаление client_socket.close()
Слепое получение некоторого количества байтов не поможет. Вам понадобится схема кадрирования, такая как stackoverflow.com/a/17668009/51685 (или даже немного более продвинутая TLV).
Основная ошибка заключается в том, что вы не использовали цикл while
в функции приема клиентского кода сокета.
В коде вашего сервера небезопасно, когда к серверу подключаются несколько клиентов, и при возникновении ошибки код аварийно завершает работу.
while
в функцию получения кода клиента сокета.try-except
.Я успешно протестировал следующие коды.
Код сокет-сервера:
import socket
import threading
clients = []
clients_lock = threading.Lock()
def handle_client(client_socket, client_address):
while True:
try:
data = client_socket.recv(1024)
if not data:
break
message = data.decode('utf-8')
print(f"Received message from {client_address}: {message}")
# Broadcast message to all clients
with clients_lock:
for client in clients:
if client != client_socket:
client.sendall(message.encode('utf-8'))
except ConnectionResetError:
break
with clients_lock:
clients.remove(client_socket)
client_socket.close()
print(f"Connection closed from {client_address}")
def main():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 8080
server_socket.bind((host, port))
server_socket.listen()
print(f"Server listening on {host}:{port}")
while True:
client_socket, client_address = server_socket.accept()
print(f"Accepted connection from {client_address}")
with clients_lock:
clients.append(client_socket)
client_handler = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_handler.start()
if __name__ == "__main__":
main()
Код клиента сокета:
import socket
import threading
def receive():
while True:
try:
data = client_socket.recv(1024)
if data:
msg = data.decode('utf-8')
print(f"Received data: {msg}")
else:
break
except ConnectionResetError:
break
def main():
global client_socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = '127.0.0.1'
port = 8080
client_socket.connect((host, port))
username = input('Username: ')
client_socket.sendall(username.encode('utf-8'))
receive_handler = threading.Thread(target=receive)
receive_handler.start()
while True:
message = input("Enter your message: ")
if message:
client_socket.sendall(message.encode('utf-8'))
if __name__ == "__main__":
main()
Проверьте это stackoverflow.com/questions/17667903/…, чтобы получить все данные, а не только 1024.