我有一个使用nodejs构建的Web应用程序。后端正在调用多个Java命令行来回答查询。那些Java程序依赖于相当大的模型(约50Mo),并且对于执行的每个Java命令行,都需要重新加载模型。最终,大部分响应时间都花在了将这些模型加载到RAM上。
我想做的是在nodejs服务器旁边设置一个Java服务器,并使这两个服务器通信。Java服务器将保持RAM中的模型并处理所有Java处理过程。问题是nodejs是异步的,并且我想在Java服务器结束处理数据时触发回调。您知道有什么好方法可以做到这一点吗?是否可能从node向localhost发送某种POST请求?
编辑:
好的,自jfriend00和Pelit Mamani回答了我的问题之后,我取得了一些进展。我决定使用jfriend00的解决方案使用socket.io。以下是我想要做的事情的确切代码(这里是JavaScript):
当我用我的JavaScript客户端运行这个服务器时,一切正常:
我想做的是在nodejs服务器旁边设置一个Java服务器,并使这两个服务器通信。Java服务器将保持RAM中的模型并处理所有Java处理过程。问题是nodejs是异步的,并且我想在Java服务器结束处理数据时触发回调。您知道有什么好方法可以做到这一点吗?是否可能从node向localhost发送某种POST请求?
编辑:
好的,自jfriend00和Pelit Mamani回答了我的问题之后,我取得了一些进展。我决定使用jfriend00的解决方案使用socket.io。以下是我想要做的事情的确切代码(这里是JavaScript):
I have a server (the one that I would like to have in Java, here in 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);
And I have a client (in my case it will be my nodejs server):
// 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); }); });
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客户端运行这个服务器时,一切正常:
On the client side:
Connected! Sending query ... I am the answer from the Server!
On the server side:
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 不应该用于发送那样的数据。我可能会改用另一种实现方式。待续...