服务器几乎分别同时向同一个客户端发送两条数据,有时候客户端得到的数据包是正常的(上面这个就是正常的)。有时候会把两条合并成一条数据发过来。导致json格式解析错误。我用的text协议。这个粘包问题我搜过其它帖子说的text协议自己已经处理了粘包,但是我发现我这边还是有这个问题,是哪里没有设置对吗?下面这个就是有时候会粘包的情况,两条合成一条了。
应该是业务逻辑的问题。 比如服务端send的数据就是把2个数据合并在一起发送了。
// 向所有人发送 $data['client_list']=$client_list; Gateway::sendToAll(json_encode($data)."\n"); // 向当前client_id发送数据 Gateway::sendToClient($client_id, "当前用户:$client_id said $message"."\n"); 就是先后发送两条数据。本身是不允许这样做吗?只能发送一条数据是不?
这样可以,前提是gatway使用了协议,如果是text协议,gatewayWorker里发送数据不需要手动加"\n"。另外js无法直接使用text协议。所以我不清楚你到底什么情况。
我用的node,可以使用text协议。我在当客户端发来消息时触发onMessage里面,向客户端发送消息Gateway::sendToAll()和Gateway::sendToClient()。客户端收到消息就会出现有时候粘包的现象,有时候又是正常的
因为node没有根据协议来分包导致的。node收到消息后根据换行符"\n"来分下包就好了。也就是说,你的node应该就是一个裸tcp,没有使用任何协议,没有做分包。
好的,明白了,谢谢了
客户端你做下分包处理啊
恩,我以为text协议客户端接收到的已经是分包处理了的,不需要客户端自行处理,现在明白了,还是需要处理
需要约定 分包处理。
应该是业务逻辑的问题。
比如服务端send的数据就是把2个数据合并在一起发送了。
// 向所有人发送
$data['client_list']=$client_list;
Gateway::sendToAll(json_encode($data)."\n");
// 向当前client_id发送数据
Gateway::sendToClient($client_id, "当前用户:$client_id said $message"."\n");
就是先后发送两条数据。本身是不允许这样做吗?只能发送一条数据是不?
这样可以,前提是gatway使用了协议,如果是text协议,gatewayWorker里发送数据不需要手动加"\n"。另外js无法直接使用text协议。所以我不清楚你到底什么情况。
我用的node,可以使用text协议。我在当客户端发来消息时触发onMessage里面,向客户端发送消息Gateway::sendToAll()和Gateway::sendToClient()。客户端收到消息就会出现有时候粘包的现象,有时候又是正常的
因为node没有根据协议来分包导致的。node收到消息后根据换行符"\n"来分下包就好了。也就是说,你的node应该就是一个裸tcp,没有使用任何协议,没有做分包。
好的,明白了,谢谢了
客户端你做下分包处理啊
恩,我以为text协议客户端接收到的已经是分包处理了的,不需要客户端自行处理,现在明白了,还是需要处理
需要约定 分包处理。