CaSper дал мне код сервера, где несколько клиентов могут подключаться к серверу, но проблема в том, что клиенты не могут общаться друг с другом ...
Это в первую очередь потому, что ваш клиентхочет s_name = s.recv(1024)
, в то время как сервер CaSper не отправляет свое имя.Вот вариант вашего клиента (ожидающий host и port в качестве аргументов команды), который работает с сервером CaSper и также решает вашу первоначальную проблему ( клиент может отправить только одно сообщение навремя ) с использованием отдельных потоков:
import socket
import sys
s = socket.socket()
s.connect((sys.argv[1], int(sys.argv[2])))
name = input(str("Please enter your username : "))
print(" Connected to chat server")
s.send(name.encode())
def receive_and_print():
for message in iter(lambda: s.recv(1024).decode(), ''):
print(":", message)
print("")
import threading
background_thread = threading.Thread(target=receive_and_print)
background_thread.daemon = True
background_thread.start()
while 1:
s.send(input("Please enter your message: ").encode())
print("Sent")
print("")
Обратите внимание, что у сервера CaSper есть ряд недостатков:
- Даже сейчас, когда ваши клиенты могут отправлять сообщения в любое время,сервер ожидает сообщения от одного клиента, то есть, когда он ожидает клиента A, клиент B может отправить сообщение, но сервер получает и передает его только после того, как клиент A отправил что-то.
- Это нене обрабатывает отсоединения клиентов.
- Когда все клиенты отключаются, он входит в цикл занятости.
Для лучшего примера сервера см. вопрос Обработка нескольких запросов с помощью select .
… не могли бы вы изменить мой сервер, чтобы он работал…
Вот вариант вашего сервера, который работает с этим клиентомТакже используются отдельные потоки для ввода и приема:
import socket
import sys
s = socket.socket()
host = socket.gethostname()
print(" server will start on host : ", host)
port = 8080
s.bind((host,port))
name = input(str("Please enter your username: "))
print("")
print("Server is waiting for incoming connections")
print("")
s.listen(1)
conn, addr = s.accept()
print("Recieved connection")
print("")
s_name = conn.recv(1024)
s_name = s_name.decode()
print(s_name, "has joined the chat room")
def input_and_send():
while 1:
message = name+" : "+input(str("Please enter your message: "))
conn.send(message.encode())
print("Sent")
print("")
import threading
background_thread = threading.Thread(target=input_and_send)
background_thread.daemon = True
background_thread.start()
for message in iter(lambda: conn.recv(1024).decode(), ''):
print(s_name, ":", message)
print("")