Я пытаюсь настроить приложение для обмена сообщениями, для забавы, но сервер не передает мои сообщения обратно клиенту.
У меня есть 2 файла, которые я планирую объединить в 1 для более легкого использования, это файлы client.py и server.py.
Мое приложение работало, но затем другой пользователь сказал, что мой server.py может обрабатывать только 1 соединение, и я намерен сделать это теоретически бесконечная программа (минус аппаратные ограничения и т. д. c.)
client.py выглядит как ...
## -- Setup -- ##
## Lib
from socket import *
import socket
## Vars
host = input("Host: ") # Host/IP of the server
port = int(input("Port: ")) # Int of the port that the server is listening on
username = input("Username: ")
username = "<" + username + ">"
print(f"Connecting under nick \"{username}\"")
## -- Main -- ##
clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Creates socket
clientsocket.connect((host, port)) # Connects to the server
while True: # Sending message loop
Csend = input("MSG: ") # Input message
#Csend = f"{username} {Csend}" # Add username to message
clientsocket.send(Csend.encode()) # Send message to ONLY the server
print(clientsocket.recv(1024).decode())
Это используется для подключения к серверу, я обеспокоен тем, пока петли, поскольку они могут мешать моему Tkinter GUI (когда я настрою его позже).
server.py выглядит как ...
## -- Setup -- ##
## Lib
import socket # Import socket module
try:
import thread
except:
import threading
## Server
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host_name = socket.gethostname() # Get Name
host = socket.gethostbyname(host_name) # Get IP
port = int(input("What port are you listening on?\n"))
print(f"Server started!\nHost: {host}\nPort: {port}")
print("Waiting for clients...")
serversocket.bind((host, port)) # Bind to the port
serversocket.listen(5) # Now wait for client connection.
## -- Subprograms -- ##
def new_client(clientsocket, address):
print(f"{address} connected")
while True:
Srecv = clientsocket.recv(1024).decode()
print(f"{address}: \"{msg}\"")
# CHECKS AND GAMES GO HERE - (game plugins using txt for import dir?)
clientsocket.sendall(Srecv.encode())
clientsocket.close()
## -- Main -- ##
while True:
clientsocket, address = serversocket.accept() # Accept incoming connections
threading.Thread(target = new_client, args = (clientsocket,address))
serversocket.close()
Пользователь предложил мне использовать потоки чтобы подготовить сервер к подключению нескольких клиентов.
Цель Цель состоит в том, чтобы иметь приложение для обмена сообщениями, которое может работать с кросс-соединениями, сейчас я тестирую его на той же машине (и иногда на локальном хосте), но хочу быть возможность отправлять сообщения своим друзьям, которые используют разные ОС на разных соединениях.
Идея состоит в том, что когда сообщение отправляется, оно использует sendall для отправки его обратно исходному отправителю, а также для передачи сообщения каждому соединению.
Итак, если мой код теоретически работал так, как я планировал, мой ожидаемый результат для клиента был бы
<MSG> hello
hello
, а для сервера он был бы ...
[person address]: hello