玩 scala websocket - 按顺序而不是并行点击 websocket
Play scala websocket - Hits websocket sequentially not In parallel
我已经创建了一个网络套接字来接收单个消息,它将进行一些处理并 returns 将响应消息发送给客户端。我使用 Play 框架创建了网络套接字。代码片段如下。
代码片段:
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中实现多线程来处理这种请求吗?
或者我是否遗漏了处理来自单个客户端的多个请求的代码?
我了解这是网络套接字行为。此 详细解释了您的 Web 套接字连接如何由客户端计算机和服务器的 (IP,PORT)
对以及所使用的协议唯一标识。
所以基本上您的客户端和服务器之间只能有一个 "physical websocket connection"(使用相同的端口)。查看 accept 的文档,我阅读了
If no pending connections are present on the queue, and the socket is not marked as nonblocking, accept() blocks the caller until a connection is present. If the socket is marked nonblocking and no pending connections are present on the queue, accept() fails with the error EAGAIN or EWOULDBLOCK.
我希望有更多知识渊博的人来确认它,但我从这句话中了解到,由于您的潜在连接正忙于处理第一条消息,accept
会告诉您第二个请求 "try later",因此是顺序效应。
如果您真的需要一个客户端的并行 websocket,我想在不同的端口上打开连接就可以了。
我已经创建了一个网络套接字来接收单个消息,它将进行一些处理并 returns 将响应消息发送给客户端。我使用 Play 框架创建了网络套接字。代码片段如下。
代码片段:
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中实现多线程来处理这种请求吗?
或者我是否遗漏了处理来自单个客户端的多个请求的代码?
我了解这是网络套接字行为。此 (IP,PORT)
对以及所使用的协议唯一标识。
所以基本上您的客户端和服务器之间只能有一个 "physical websocket connection"(使用相同的端口)。查看 accept 的文档,我阅读了
If no pending connections are present on the queue, and the socket is not marked as nonblocking, accept() blocks the caller until a connection is present. If the socket is marked nonblocking and no pending connections are present on the queue, accept() fails with the error EAGAIN or EWOULDBLOCK.
我希望有更多知识渊博的人来确认它,但我从这句话中了解到,由于您的潜在连接正忙于处理第一条消息,accept
会告诉您第二个请求 "try later",因此是顺序效应。
如果您真的需要一个客户端的并行 websocket,我想在不同的端口上打开连接就可以了。