我试图建立一个简单的聊天室,但从基础开始。我有一个服务器向客户端发送字符串,但是,我的while循环不会中断。
服务器
import socket
HOST = '' # Symbolic name meaning the local host
PORT = 50023 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print ('Connected by', addr)
conn.send("hello client")
conn.send("\nhow are you")
conn.send("stop")
客户端
import socket
HOST = 'localhost' # The remote host
PORT = 50023 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
data = s.recv(1024)
if data == "stop":
break
print(data)
print("we got here")
我想指出我也尝试过
if not data:
break
那不起作用
答案 0 :(得分:5)
您的服务器正在发送:
hello client\nhow are youstop
但是您的客户正在测试
stop
自"hello client\nhow are youstop" != "stop"
起,您不太可能点击break
声明。
意识到TCP提供了可靠的字节流;只要每个字节按正确的顺序到达目的地,就可以完成TCP的工作。没有消息边界,只有字节边界。一方的.recv()
无需以任何方式与其他方.send()
对齐。
如果您想要保留邮件边界的服务,可以尝试使用UDP。或者,您可以在TCP之上实现自己的消息框架(例如换行符或类型长度值元组)。
答案 1 :(得分:0)
您的代码中的细微变化使您可以在简单的聊天中继续进行。
首先,不要发送字符串。使用二进制文件在服务器和客户端之间发送消息。
例如,服务器的代码为:
import socket
HOST = '' # Symbolic name meaning the local host
PORT = 50023 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print ('Connected by', addr)
conn.send(b"hello client")
conn.send(b"\nhow are you")
conn.send(b"stop")
注意服务器现在正在发送二进制文件(在字符串之前使用b来设置二进制数据)。
在客户端,您发送的所有数据都像数据流一样被接收。要打破while循环,您需要检查流的结尾,如下面的代码所示:
import socket
HOST = 'localhost' # The remote host
PORT = 50023 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
data = s.recv(1024)
if data.endswith(b'stop'):
break
print(data)
print(b"we got here")
我希望它对你有用!