当前位置: 首页 > 知识库问答 >
问题:

播放scala web套接字-按顺序不并行地点击web套接字

尹俊贤
2023-03-14

我已经创建了一个web socket来接收单个消息,它将进行一些处理并将响应消息返回给客户端。我已经使用Play框架创建了web socket。下面给出了代码片段。

代码片段:

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))
  }

我已经测试了我的web套接字从http://www.websocket.org/echo.html.我连接了我的web套接字,并按顺序传递了三个消息,分别是“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

web socket请求似乎是顺序地而不是并行地命中服务器的。当我经过客户端时,客户端立即发送了三条消息。但是它并没有同时攻击服务器。

也就是说,第二个请求在第一个响应消息之后命中。第三条消息在第二条响应消息之后出现。

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

还是我要在Scala play框架中实现多线程来处理这类请求?

或者我在处理来自单个客户端的多个请求的代码中遗漏了什么?

共有1个答案

周子平
2023-03-14

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

所以基本上,您的客户机和服务器之间只能有一个“物理websocket连接”(使用同一端口)。看着接受的文档,我读到

如果队列中不存在挂起的连接,并且套接字未标记为非阻塞,则 accept() 会阻止调用方,直到存在连接。如果套接字被标记为非阻塞,并且队列中不存在挂起的连接,则 accept() 将失败并显示错误 EAGAIN 或 EWILLBLOCK。

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

如果您真的需要为一个客户端提供并行web套接字,我想在不同端口上打开连接会有所帮助。

 类似资料:
  • 已经问过类似的问题,但是删掉了,既然以为我修好了,但是我错了。 我在生产中为我的一个web项目使用Play framework。有时播放不呈现主页面或不返回一些静态内容文件。 最初应用程序运行良好,它必须工作5-7天,我可以看到这个问题。很难重现,它发生了15次中的1次,我不得不删除缓存数据和重新加载页面。(按下FF中的CRTL-F5)。问题可以在不同机器和操作系统的大多数浏览器中重现。最初,我认

  • 问题内容: 我试图理解SocketChannels和NIO。我知道如何使用常规套接字,以及如何制作一个简单的每客户端线程服务器(使用常规阻塞套接字)。 所以我的问题是: 什么是SocketChannel? 当使用SocketChannel而不是Socket时,我还能得到什么呢? 通道和缓冲区之间是什么关系? 什么是选择器? 文档中的第一句话是。那是什么意思? 我也阅读了本文档,但是不知何故…… 问

  • socket_read和socket_recv之间有什么区别?我正在尝试使用PHP套接字,但使用socket_read时收到了以下警告: 请帮帮我!

  • 请问,有任何简单的方法流(广播)媒体文件(ogg,mp3,SPX..)通过Node.js和Socket.io从服务器到客户机(浏览器)?

  • 问题内容: 我正在建立一个客户-服务器项目。 我需要的是客户端发送一个字符串,例如“ Pendu”,服务器接收该字符串并将一个名为“ Pendu”的对象发送回客户端。 这是我的代码: 该类在包中定义: 我的问题是: 首先,我执行服务器,然后看到控制台中显示的内容。 然后我执行客户端,在控制台中,我收到如下消息: 同时,服务器端未显示任何新内容。 现在,我停止客户端,并显示服务器的所有其他消息: 当

  • 开始使用akka-streams,我想构建一个简单的示例。在chrome中,使用web套接字插件,我可以通过并发送2个命令,简单地连接到这样的流https://blockchain.info/api/apiwebsocket 将在chromes web socket插件窗口中传输结果。 我试图在akka流中实现相同的功能,但面临一些问题: 执行了2个命令,但我实际上没有获得流输出 同一命令执行两次