localhost上的node.js和java服务器之间的通信

时间:2015-06-07 07:39:04

标签: java node.js socket.io netty

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

我想要做的是设置一个java服务器和nodejs一个,并使这两个服务器进行通信。 java服务器会将模型保存在RAM中并处理所有java处理。问题是节点是异步的,我想在我的java服务器结束处理数据时触发回调。你知道有什么好办法吗?是否可以在localhost上从节点向java发送某种POST请求?

修改

好的,因为all_different/1jfriend00回答了我,我取得了一些进展。我决定使用Pelit Mamani的解决方案来使用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); 
        });
    
    });
    

客户端发送查询,服务器回答查询,简单。我使用jfriend00在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 个答案:

答案 0 :(得分:1)

  1. 如果你使用http或tcp,node.js是异步的这一事实并不能阻止java方面同步工作&#34; ...如果你有一个标准的Servlet来读取请求并写一个回复(在同一个线程上),它仍会转换为node.js端的标准异步代码。它会发送请求,然后在java回答时收到回调...

  2. 作为旁注,您可能还想查看异步队列协议(如Rabbit MQ),但这超出了您所描述的基本要求。例如。这取决于你需要通信的可靠性,如果java服务器崩溃会发生什么等。