node.js和本地主机上的java服务器之间的通信

我有一个使用nodejs构build的Web应用程序。 后端调用几个java命令行来回答查询。 那些java程序依赖于非常大的模型(大约50Mo),并且对于每个执行的java命令行模型都需要重新加载。 最后,大部分答案时间都花在了将这些模型加载到RAM中。

我想要做的是与nodejs一起build立一个java服务器,并使这两个服务器通信。 Java服务器将保持RAM中的模型,并处理所有的Java处理。 问题是节点是asynchronous的,我想在我的java服务器结束处理数据时发起一个callback。 你知道有什么好办法做到这一点? 是否有可能在本地主机上发送某种POST请求从节点到Java?

编辑:

好吧,因为jfriend00和Pelit Mamani回答我,我已经取得了一些进展。 我决定用jfriend00的解决scheme来使用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发送这样的数据。 我可能会改变另一个实现。 未完待续…

  1. 如果你使用http或tcp,那么node.js是asynchronous的这一事实并不妨碍java端同步工作……例如,如果你有一个标准的Servlet来读取一个请求并写一个回复(在同一个线程),它仍然会转化为node.js端的标准asynchronous代码。 它会发送请求,然后得到一个callback时,Java的答案…

  2. 作为一个方面说明,你可能也想看一下asynchronous排队协议,比如Rabbit MQ,但是这超出了你所描述的基本要求。 例如,这取决于您需要通信的可靠程度,如果Java服务器崩溃,会发生什么情况等等。