我有一个通过 Play 2.1 连接到 javascript 前端的简单 websocket 连接设置。
我在服务器上有一个随机数生成循环,它生成一个随机数并通过 websocket 发送出去。随机数生成是在无休止的 while 循环中执行的。我创建了一个 Akka Actor,它只是通过创建的 websocket 发送它接收到的消息。
问题
在每次迭代中生成要通过 websocket 发送的随机数的 while 循环中,它永远不会通过 websocket 发送任何内容。当我实际限制循环以使其真正结束时,所有生成的数字都在 while 循环结束时发送,并且在每次迭代中实际上并不实时发送。我不知道如何让它工作,以便它在每次迭代中发送。
请参阅下面的代码。
具有随机数生成器功能的应用程序框架
public class Application extends Controller {
// Default MqTT Messages Actor
static ActorRef defaultMqttActor = Akka.system().actorOf(new Props(WebsocketHandle.class));
public static WebSocket<String> realTimeChartConnection() {
return new WebSocket<String>() {
// called when the websocket is established
public void onReady(WebSocket.In<String> in,
WebSocket.Out<String> out) {
// register a callback for processing instream events
in.onMessage(new Callback<String>() {
public void invoke(String event) {
System.out.println(event);
}
});
System.out.println("Websocket Connection ready ...");
WebsocketHandle.setWebsocketOut(out);
sendRandomNumbers();
}
};
}
public static void sendRandomNumbers() {
int prev = 50;
while (true) {
int y = (int) (prev + Math.random() * 10 - 5);
if (y < 0)
y = 0;
if (y > 100)
y = 100;
defaultMqttActor.tell(""+y);
System.out.println(""+y);
try {
Thread.currentThread();
Thread.sleep(30);
} catch (Exception e) {
System.out.println(e.getStackTrace());
}
}
}
}
WebsocketHandle Actor 代码
static ActorRef defaultMqttActor = Akka.system().actorOf(new Props(WebsocketHandle.class));
WebsocketHandle
public class WebsocketHandle extends UntypedActor {
public static WebSocket.Out<String> outStream;
public static void setWebsocketOut(WebSocket.Out<String> out){
outStream = out;
}
public void onReceive(Object message) throws Exception {
outStream.write((String)message);
}
}
如您所见,actor 只是发送它在“onReceive”中接收到的消息。随机数生成循环只是“告诉”生成的数字。我不明白为什么它不通过 websocket 异步发送消息。
似乎 Websocket 正在缓冲结果......我怎样才能让 websocket 立即发送数据?