我正在开发一款浏览器游戏。
服务器端是在Play Framework 2.5.x(scala)上编写的。客户端(JS应用程序)通过websocket与服务器通信。服务器每250毫秒发送一次客户端消息
问题是每位玩家的流量接近16kB /秒,我希望尽可能减少流量。
每条消息都是围绕玩家的序列化游戏状态,看起来像这样(实际的json更大,这只是显示了这个想法):
{
"gameState": {
"player": {
"id": 218,
"body": [[42, 20],[42, 21],[43, 21],[43, 20]],
"name": "player",
"color": 1,
"isBot": false
},
"food": [[25, 25],[24, 25],[24, 24],[24, 23],[23, 23]],
"enemies": [{
"id": 217,
"body": [[53, 46],[53, 47],[53, 48],[53, 49]],
"name": "roBot#217",
"color": 22,
"isBot": true
}]
}
}
我阅读了几篇文章并认为我必须压缩发送给客户端的消息。所以,我尝试在播放应用程序中通过gzip过滤所有响应:
@Singleton
class Filters @Inject() (gzipFilter: GzipFilter, implicit val materializer: Materializer)
extends DefaultHttpFilters(gzipFilter) {
new GzipFilter(shouldGzip = (request, response) => {
response.header.headers.get("Content-Type").exists(_.startsWith("application/json"))
})
}
但是这个过滤器不起作用。服务器仍然发送未压缩的数据。我做错了什么?
答案 0 :(得分:0)
您是否添加all settings以启用gzip过滤器?
我没有看到你提到这两点:
1)将Play过滤器项目添加到libraryDependencies
中的build.sbt
:
libraryDependencies += filters
2)Filters
类可以位于根包中,或者如果它具有其他名称或位于另一个包中,则需要使用play.http.filters
中的application.conf
进行配置:< / p>
play.http.filters = "filters.MyFilters"
并尝试从@Singleton
中删除Filter
- 过滤器文档中没有此注释,我也没有在我的项目中使用它。