【发布时间】:2015-06-07 07:39:04
【问题描述】:
我有一个使用 nodejs 构建的 Web 应用程序。后端正在调用几个 java 命令行来回答查询。这些 java 程序依赖于非常大的模型(大约 50Mo),并且对于每个执行的 java 命令行,都需要重新加载模型。最后,大部分回答时间都花在了将这些模型加载到 RAM 中。
我想做的是与nodejs一起设置一个java服务器,并使这两个服务器通信。 java 服务器会将模型保存在 RAM 中并处理所有 java 处理。问题是节点是异步的,我想在我的 java 服务器结束处理数据时触发回调。你知道有什么好方法吗?是否可以从节点向本地主机上的 java 发送某种 POST 请求?
编辑:
好的,因为 jfriend00 和 Pelit Mamani 回答了我,我已经取得了一些进展。我决定使用jfriend00 的解决方案来使用socket.io。这正是我想做的事情(在 javascript 中):
-
我有一台服务器(我想在 Java 中使用,这里是 javascript)
var http = require('http'); console.log('Creating HTTP server'); var server = http.createServer(function(req, res){ }); var io = require('socket.io').listen(server); io.sockets.on('connection', function(socket) { console.log('Client connected.'); // Disconnect listener socket.on('disconnect', function() { console.log('Client disconnected.'); }); socket.on('myEvent', function (data, fn) { console.log(data); console.log('\tSending answer ...'); fn('\tI am the answer'); }); }); server.listen(8080); -
我有一个客户端(在我的情况下,它将是我的 nodejs 服务器):
// Connect to server var io = require('socket.io-client') var socket = io.connect('http://localhost:8080'); socket.on('connect', function () { console.log('Connected!\n\tSending query ...'); socket.emit('myEvent', '\tI am the query', function (data) { console.log(data); }); });
客户端发送查询,服务器回答查询,很简单。我使用netty-socketio 在java 中实现服务器部分。这是我现在拥有的:
import java.io.UnsupportedEncodingException;
import com.corundumstudio.socketio.AckRequest;
import com.corundumstudio.socketio.Configuration;
import com.corundumstudio.socketio.SocketIOClient;
import com.corundumstudio.socketio.SocketIOServer;
import com.corundumstudio.socketio.Transport;
import com.corundumstudio.socketio.listener.*;
public class App {
public static void main(String[] args) throws InterruptedException, UnsupportedEncodingException {
Configuration config = new Configuration();
config.setHostname("localhost");
config.setPort(8080);
final SocketIOServer server = new SocketIOServer(config);
server.addConnectListener(new ConnectListener() {
@Override
public void onConnect(SocketIOClient client) {
System.out.println("client connected !: "+client.toString());
}
});
server.addEventListener("myEvent", String.class, new DataListener<String>() {
@Override
public void onData(final SocketIOClient client, String data, final AckRequest ackRequest) {
System.out.println("myEvent triggered");
System.out.println("Here is the query from the client: \n"+data);
ackRequest.sendAckData("I am the answer from the Server!");
}
});
server.addDisconnectListener(new DisconnectListener() {
@Override
public void onDisconnect(SocketIOClient client) {
System.out.println("client disconnected !: "+client.toString());
}
});
server.start();
System.out.println("server started");
Thread.sleep(20000);//Integer.MAX_VALUE);
server.stop();
System.out.println("server stopped");
}
}
使用我的 javascript 客户端运行此服务器时,一切正常:
-
在客户端:
Connected! Sending query ... I am the answer from the Server! -
在服务器端:
server started client connected !: com.corundumstudio.socketio.transport.NamespaceClient@ecac7898 myEvent triggered Here is the query from the client: I am the query client disconnected !: com.corundumstudio.socketio.transport.NamespaceClient@ecac7898
但我不认为应该使用 AckRequest 来发送这样的数据。我可能会改变另一个实现。待续……
【问题讨论】:
-
nodejs服务器和Java服务器可以通过任何常见的网络技术(http请求、socket.io消息、你自己的自定义TCP协议等)进行异步通信。我不明白为什么您认为 nodejs 的异步特性会给您带来问题,因为无论如何所有网络都已经是异步的。您只需让 Java 服务器在完成处理后向 nodejs 服务器发送一条消息,然后 nodejs 服务器就可以调用之前注册的一些回调。
-
我感到困惑的一点是我的 java 服务器如何将消息发送回节点并触发一些回调。这是我的第一个 Web 应用程序、第一个 nodejs 服务器和第一个 java 服务器,如果您能指出一些示例代码,将不胜感激。
-
还有一个使用nodejs服务器作为socket.io客户端连接另一个socket.io服务器here的例子。
标签: java node.js socket.io netty