【发布时间】:2018-06-28 01:05:05
【问题描述】:
我已尝试通过 python 2.7 上的此代码从我的连接中接收数据:
server = socket(AF_INET, SOCK_STREAM)
server.bind(('0.0.0.0', 21))
server.listen(1)
client , addr = server.accept()
data = client.recv(2048)
当我必须打印或将我的数据发送到另一个连接时,它正在工作,但是我想添加这些行:
if(data == "/disconnect") :
<disconnect blha blha... you know >
else :
<print the data and send it back blha blha... >
(我已经检查了没有那个 if 语句和“disconnect blha blha ..”效果很好)
它只是传递代码,所以当我的客户端请求断开连接时,请求会作为“原始”消息发送到服务器..(服务器不会踢他)
我该怎么办?谢谢!
【问题讨论】:
-
A TCP socket is just a stream of bytes, not a stream of messages. 当您调用
client.recv(2048)时,您可能会从客户端获得send的前两个字节,或者整个内容,或者一个send的最后一部分,两个更多sends,以及第四部分的第一部分。所以,它不太可能等于/disconnect。 -
如果你想用 TCP 处理消息而不是字节,你必须想出一个消息帧协议。最简单的一种是,每条消息都是一堆以
b'\n'结尾的字节,或者是一堆以UTF-8 编码'\n'结尾的UTF-8 编码字符。如果您的消息可以包含嵌入的换行符,这将不起作用,但如果不能,则非常容易,尤其是因为socket对象上的makefile方法为您完成了整个协议的实现。 -
如果您不确定这是否是问题所在,请尝试将
print(repr(data))添加到服务器并查看打印结果。如果你得到'/disco'或'/me is leaving\n/disconnect'或类似的东西,那是你的问题,它是this question 的重复(以及我们可以查找和添加的其他各种)。如果您得到不同的东西,那么您可能在那个问题之上还有另一个问题,但除非您向我们展示您得到的东西,否则我们无法调试它。 (如果相关,查看示例客户端和示例用户输入也将有所帮助。) -
写下你的端口:21 主机名:DESKTOP-7G40JN7 服务器监听:(my_ip):21(phone_ip):已连接! (phone_ip) : 'dmdk\r\n' (phone_ip) : 'hey\r\n' # 输出 "hey"
-
这甚至不包含
/discconnect流中的任何位置。那么,您为什么认为data == "/disconnect"是真的呢?
标签: python