Я пытался найти ответ, но не могу найти тот, который отвечает на мою конкретную проблему.
Возможно, я не знаю, как правильно сформулировать проблему.
Кажется, я точно определил, что это такое, но дело в том, что я просто не знаю, как это исправить.
РЕДАКТИРОВАТЬ: я пытался использовать двух клиентов на одном сокете TCP. Не могу этого сделать. Мне придется думать о другом пути. Думаю, решено.
Так что у меня есть
1: два клиента
2: один сервер
Цель заключается в следующем: Заставить сервер распространять новые имена пользователей для всех клиентов по мере их подключения.
Вот что происходит, когда я запускаю программу:
Сервер: определите хост и порт, инициализируйте его. Проверить
Клиент 1: подключается к серверу. Проверить
Клиент 1: после подключения отправляет строку на сервер. Проверить
Сервер: получает строку, проверяет, находится ли строка в списке. Если да: пройти, если нет, отправить всем новую строку. Проверить
Клиент 1: [Ожидает получения данных] Получает данные, проверяет, соответствует ли полученная строка той, которую он отправил. Если это так, напечатайте («Это один из наших!»), В противном случае сделайте новую строку = для имени пользователя клиента 2. Проверить
Клиент 2: подключается к серверу: Проверить
Сервер: [Если он получает строку, печатает ее.] (Работает) Проверяет, есть ли новая строка в списке. [Это не так] Итак, новое имя пользователя отправляется всем, а затем печатается ("Отправлено всем") Проверить
Но когда клиент 2 получает строку, он печатает ее. Однако клиент 1 никогда не получает строку.
И при запуске клиента 1 в IDLE я заметил, что что-то пошло не так, поскольку клиент 1 пытался получить данные. (Цикл while, в котором data = s.recv начал выполняться очень быстро, вместо ожидания)
Я поспрашивал в чате, но, кажется, сейчас никого нет. Я пытался найти это, но я действительно не могу найти ответ. Я подозреваю, что когда мой сервер отправляет запрос на "подключение" во второй раз, он каким-то образом переопределяет исходное клиентское подключение.
Вот мой код сервера:
from socket import *
import threading
import os
import csv
Username_List = []
host = input("Host: ")
port = input("Port: ")
ss = socket(AF_INET,SOCK_STREAM)
ss.bind((host,int(port)))
ss.listen(2)
while True:
try:
connection,address = ss.accept()
data = connection.recv(1024)
if data:
translated_data = data.decode()
print(translated_data)
if translated_data in Username_List:
pass
else:
Username_List.append(translated_data)
connection.sendall(translated_data.encode())
print("Sent new username to everyone")
except IOError:
connection.close()
print("An exception with a connected user occured")
break
А вот код моего клиента: [Единственная разница между клиентом 1 и клиентом 2 заключается в том, что я изменил переменную имени пользователя]
# Sample Username Client Service Handler.
from socket import *
import threading
import os
import csv
Username = ("Owatch")
host = input("Host: ")
port = input("Port: ")
try:
ss = socket(AF_INET,SOCK_STREAM)
ss.connect((host,int(port)))
except IOError:
print("Aw no man")
ss.send(Username.encode())
while True:
try:
print("Waiting to Recieve Data")
data = ss.recv(1024)
if data:
translated_data = data.decode()
print(translated_data)
if translated_data == Username:
print("It's one of ours!")
else:
Client_Username = translated_data
print (Client_Username)
except Exception as e:
print (vars(e))
Если бы вы могли помочь, пожалуйста, я был бы признателен.
Если вам известен ответ на мой вопрос, который уже был задан, сообщите мне, и я удалю это сообщение, чтобы не нарушать правила. Спасибо!