我创建了一个接收单个消息的Web套接字,它将进行一些处理并将响应消息返回给客户端。我已经使用Play框架创建了Web套接字。下面给出了代码片段。
代码片段:
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 测试了我的网络套接字。我已经连接了我的 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 套接字请求按顺序而不是并行命中服务器。当我传递它时,客户端立即发送的三条消息。但它并没有并行命中服务器。
也就是说,第二个请求在第一个响应消息之后命中。第三条消息在第二条响应消息之后命中。
这是默认的 Web 套接字行为吗?
还是我想在 Scala play Framework 中实现多线程来处理此类请求?
或者我是否在代码中遗漏了处理来自单个客户端的多个请求的任何内容?
我知道这是网络套接字行为。这个 SO 问题详细解释了您的 Web 套接字连接如何由客户端计算机和服务器的对(IP,PORT)
以及使用的协议唯一标识。
因此,基本上,客户端和服务器之间只能有一个"物理 websocket 连接"(使用相同的端口)。查看接受文档,我阅读了
如果队列中不存在挂起的连接,并且套接字未标记为非阻塞,则 accept() 会阻止调用方,直到存在连接。如果套接字被标记为非阻塞,并且队列中不存在挂起的连接,则 accept() 将失败并显示错误 EAGAIN 或 EWILLBLOCK。
我希望有知识渊博的人来确认它,但我从这句话中了解到,由于您的潜在连接正忙于处理第一条消息,accept
会告诉您的第二个请求"稍后再试",因此具有顺序效应。
如果您确实需要为一个客户端提供并行 websocket,我想在不同的端口上打开连接就可以了。