如何在play framework 2.5.x中减少webSocket数据流

时间:2016-10-11 14:27:17

标签: playframework websocket gzip

我正在开发一款浏览器游戏。

服务器端是在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"))
  })
}

但是这个过滤器不起作用。服务器仍然发送未压缩的数据。我做错了什么?

1 个答案:

答案 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 - 过滤器文档中没有此注释,我也没有在我的项目中使用它。