【发布时间】:2019-07-11 04:13:26
【问题描述】:
我问了一个关于我的服务器到客户端代码的问题,因为我遇到了很多问题,有人告诉我解决问题的方法是进行点对点聊天,我现在已经这样做了。
服务器.py
import socket, threading
host = "127.0.0.1"
port = 4000
s = socket.socket()
s.bind((host,port))
s.listen(5)
client_sockets = []
users = []
print("Listening")
def handle_client(conn):
while True:
try:
data = conn.recv(512)
for x in client_sockets:
try:
x.send(data)
except Exception as e:
print(e)
except:
pass
while True:
conn,addr = s.accept()
client_sockets.append(conn)
print("Connections from", addr[0], "on port",addr[1])
threading.Thread(target = handle_client,args = (conn,)).start()
客户端.py
import socket,threading
host = "127.0.0.1"
port = 4000
s = socket.socket()
s.connect((host,port))
def echo_data(sock):
while True:
try:
data = sock.recv(512)
print(data)
except:
pass
while True:
threading.Thread(target=echo_data,args=(s,)).start()
msg = input("Enter your message : ")
s.send(msg.encode())
问题是,当我运行客户端并尝试与另一个客户端交谈时,除非另一个客户端按 Enter,否则不会发送消息,这也让我遇到了第二个问题,当客户端相互发送消息时,他们以这种格式收到:
b'hi'Enter your message :
【问题讨论】:
-
@han solo 我将如何在我的代码中实现
select模块? -
检查这个。这有你需要的一切。并松开线程。 pymotw.com/2/select :)
-
@hansolo 我已经阅读了它,但我仍然不太确定如何在我的代码中实现它,所以你能告诉我如何取悦
-
@hansolo 他试图为每个客户端使用一个线程。使用这种设计,阻止客户端线程等待来自该客户端的数据就可以了。同样,在他的客户端中,他有一个线程,其目的是阻止等待来自服务器的数据。同样,阻塞该线程也很好,因为它的唯一目的是等待该连接上的数据。
-
我对python不太了解,无法帮助您。但我不认为你的程序有什么大问题。您需要将输入从行模式更改为更原始的模式,并且需要将接收到的数据从原始字节转换为可打印的字符串。除此之外,我觉得还可以。如果任何客户端拒绝从中读取数据,您的服务器将阻塞,但我认为您目前不太关心抵抗攻击。
标签: python python-3.x sockets tcp