【问题标题】:Play scala websocket - Hits websocket sequentially not In parallel播放 scala websocket - 按顺序而不是并行点击 websocket
【发布时间】:2016-03-07 12:22:38
【问题描述】:

我创建了一个接收单个消息的 Web 套接字,它将进行一些处理并将响应消息返回给客户端。我已经使用 Play 框架创建了 Web 套接字。代码sn-p如下。

代码 sn-p:

def multi_request = WebSocket.tryAccept[String] {
    request =>
      val (out, channel) = Concurrent.broadcast[String]
      val in = Iteratee.foreach[String] {
        msg =>
          channel push ("message " + msg +" request Time: " + System.currentTimeMillis()/1000)
          if(msg.equals("1")) {
            Thread.sleep(20000);
            println(msg);
          } else if(msg.equals("2")) {
            Thread.sleep(10000);
            println(msg);
          } else {
            println(msg);
          }
          channel push ("message " + msg +" response Time: " + System.currentTimeMillis()/1000)
      }
      Future.successful(Right(in, out))
  }

我已经从http://www.websocket.org/echo.html 测试了我的网络套接字。 我已经连接了我的网络套接字并依次传递了三个消息,分别为“1”、“2”和“3”。传递这些消息时,我得到了以下响应。

SENT: 1

RESPONSE: message 1 request Time: 1457351625

SENT: 2

SENT: 3

RESPONSE: message 1 response Time: 1457351645

RESPONSE: message 2 request Time: 1457351646

RESPONSE: message 2 response Time: 1457351656

RESPONSE: message 3 request Time: 1457351656

RESPONSE: message 3 response Time: 1457351656

似乎,网络套接字请求按顺序而不是并行命中服务器。当我通过它时,立即从客户端发送的三个消息。但它没有同时访问服务器。

即第二个请求在第一个响应消息之后命中。第三条消息在第二条响应消息之后命中。

这是默认的网络套接字行为吗?

或者我想在 Scala play Framework 中实现多线程来处理这种请求?

或者我是否遗漏了代码中处理来自单个客户端的多个请求的任何内容?

【问题讨论】:

    标签: scala playframework websocket playframework-2.3


    【解决方案1】:

    我知道这是网络套接字行为。此SO question 详细解释了您的 Web 套接字连接如何由您的客户端计算机和服务器的 (IP,PORT) 对以及所使用的协议唯一标识。

    所以基本上你的客户端和服务器之间只能有一个“物理 websocket 连接”(使用相同的端口)。查看accept 的文档,我阅读了

    如果队列中没有挂起的连接,并且套接字没有被标记为非阻塞,accept() 会阻塞调用者,直到连接出现。如果套接字被标记为非阻塞并且队列中没有挂起的连接,accept() 将失败并返回 EAGAIN 或 EWOULDBLOCK 错误。

    我希望有更多知识的人来确认它,但我从这句话中了解到,由于您的潜在连接正忙于处理第一条消息,accept 将告诉您的第二个请求“稍后再试”,因此会产生顺序效应。

    如果你真的需要一个客户端的并行 websocket,我想在不同的端口上打开连接就可以了。

    【讨论】:

    • 感谢您的回复。我通过stackoverflow.com/q/11976877/1584121 SO 问题确认这是网络套接字的行为。我能否在这里实现多线程(或)多处理概念来处理这种请求。
    • 我会说是的,通过为每个客户端打开多个连接(使用不同的端口,在服务器端或客户端)。但我看不出有什么用例需要你这样做(websocket 的目的是向客户端发送通知),如果你有太多客户端,请注意不要让服务器过载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2015-08-26
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多