如何将数据从Node发送到另一台服务器

时间:2018-10-01 07:04:41

标签: javascript java android node.js socket.io

我正在尝试找到一种使用 Node 作为客户端的方法,该方法会将数据发送到侦听Android应用程序的服务器。 android应用程序最初将使用其公共IP地址和它将监听的端口(套接字)向节点服务器发送发布请求。一旦有任何新内容,Node服务器就会通过已注册的套接字将JSON数据包发送到该特定应用程序。

这是否可以在Node中实现,如果不能,那么如何在Javascript中实现它,或者最好的实现方式是什么?

这是Android应用服务器

public class AndroidAppLocalServer {
    Activity activity;
    ServerSocket serverSocket;
    String message = "";
    static final int socketServerPORT = 8080;

    public AndroidAppLocalServer(Activity activity) {
        this.activity = activity;
        Thread socketServerThread = new Thread(new SocketServerThread());
        socketServerThread.start();
    }

    public int getPort() {
        return socketServerPORT;
    }

    public void onDestroy() {
        if (serverSocket != null) {
            try {
                serverSocket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private class SocketServerThread extends Thread {

        int count = 0;

        @Override
        public void run() {
            try {
                // create ServerSocket using specified port
                serverSocket = new ServerSocket(socketServerPORT);

                while (true) {
                    // block the call until connection is created and return
                    // Socket object
                    Socket socket = serverSocket.accept();
                    count++;
                    message += "#" + count + " from "
                            + socket.getInetAddress() + ":"
                            + socket.getPort() + "\n";

                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.v("MyApp", message);
                        }
                    });

                    SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(socket, count);
                    socketServerReplyThread.run();

                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private class SocketServerReplyThread extends Thread {

        private Socket hostThreadSocket;
        int cnt;

        SocketServerReplyThread(Socket socket, int c) {
            hostThreadSocket = socket;
            cnt = c;
        }

        @Override
        public void run() {
            OutputStream outputStream;
            String msgReply = "Hello from AndroidAppLocalServer, you are #" + cnt;

            try {
                outputStream = hostThreadSocket.getOutputStream();
                PrintStream printStream = new PrintStream(outputStream);
                printStream.print(msgReply);
                printStream.close();

                message += "replayed: " + msgReply + "\n";

                activity.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        Log.v("MyApp", message);
                    }
                });

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                message += "Something wrong! " + e.toString() + "\n";
            }

            activity.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    Log.v("MyApp", message);
                }
            });
        }

    }

    public String getIpAddress() {
        String ip = "";
        try {
            Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (enumNetworkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = enumNetworkInterfaces.nextElement();
                Enumeration<InetAddress> enumInetAddress = networkInterface.getInetAddresses();
                while (enumInetAddress.hasMoreElements()) {
                    InetAddress inetAddress = enumInetAddress.nextElement();

                    if (inetAddress.isSiteLocalAddress()) {
                        ip += "AndroidAppLocalServer running at : " + inetAddress.getHostAddress();
                    }
                }
            }

        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            ip += "Something Wrong! " + e.toString() + "\n";
        }
        return ip;
    }
}

1 个答案:

答案 0 :(得分:2)

是的,您可以在Node.js中执行此操作,前提是该应用程序在实际上可以公开访问的电话上运行。由于您在Android应用程序中使用的是普通TCP套接字,因此可以首先通过使用netcattelnet(例如,netcat <PUBLIC-IP> 8080)之类的工具手动连接套接字来进行验证。< / p>

如果这可行,则可以使用net.Socket类在Node.js中执行相同的操作。

const net = require('net');
const client = new net.Socket();
client.connect(8080, '<PUBLIC-IP>', () => {
    // callback, when connection successfull
    client.write('Data sent to the App');
});
client.on('data', (data) => {
    // callback, when app replies with data
});
client.on('close', (data) => {
    // callback, when socket is closed
});

但是,根据您实际尝试实现的目标,您可能需要查看Android应用程序通常如何实现推送通知。