Почему мой сервер не отображает или не отображает сообщения? - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь настроить приложение для обмена сообщениями, для забавы, но сервер не передает мои сообщения обратно клиенту.

У меня есть 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

1 Ответ

1 голос
/ 03 апреля 2020

Если вы хотите создать что-то вроде сервера чата, вам нужно отслеживать все подключенные клиенты. Не смущайтесь методом socket.sendall(), он просто отправляет все байты в данный сокет, он не имеет ничего общего с отправкой данных на все сокеты, которые вы можете иметь в виду.

Я попытался настроить немного кодируйте, чтобы показать грубую идею, но я ее не проверял:

## -- 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?)

        # Don't forget error handling!
        for sock in clients.values():
            sock.sendall(Srecv.encode())

    clientsocket.close()
    del clients[address]

clients = {}

## -- Main -- ##
while True:
    clientsocket, address = serversocket.accept() # Accept incoming connections
    clients[address] = clientsocket
    threading.Thread(target = new_client, args = (clientsocket,address))
serversocket.close()

PS Пожалуйста, не объединяйте клиент и сервер в одном файле. Почти всегда лучше разложить вещи во время программирования, чем объединять их вместе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...