casper给了我多个客户端可以连接到服务器的服务器代码,但现在的问题是客户端不能相互通信。
这主要是因为你的客户想要
s_name = s.recv(1024)
,而casper的服务器不发送其名称。这是你客户的一个变种(期望
主办
和
港口
作为命令参数),它可以与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发送了消息后才接收和广播该消息。
-
它不处理客户端断开连接。
-
当所有客户机都断开连接时,它进入一个繁忙的循环。
有关更好的服务器示例,请参见问题
Handle multiple requests with 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("")