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

标签 javascript java android node.js socket.io

我正在尝试找出一种使用 Node 作为客户端的方法,该客户端会将数据发送到监听 Android 应用程序的服务器。 Android 应用程序最初会向 Node 服务器发送一个 post 请求,其中包含其公共(public) 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;
    }
}

最佳答案

是的,您可以在 Node.js 中执行此操作,假设应用程序运行在实际上可公开访问的手机上。由于您在 Android 应用程序中使用普通 TCP 套接字,因此您可以首先使用 netcat 等工具手动连接套接字来进行验证。或telnet (例如 netcat <PUBLIC-IP> 8080 )。

如果这有效,您可以使用 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 应用程序通常如何实现推送通知。

关于javascript - 如何将数据从 Node 发送到另一台服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52586092/

相关文章:

android - 从服务器API错误输出自定义Rx Java中的onError()消息

javascript - jquery/javascript : return and if sentence

java - 连接到局域网

安卓开发 : What type of tool is this?

java - 如何摆脱警告: Nashorn engine is planned to be removed from a future JDK release?

java - 正则表达式:匹配 JUnit assertEquals?

android - 如何在 jquery mobile for android 中缓存页面

javascript - 高图 : How to add multiple lines on the same x-axis

javascript - Joi 嵌套模式

c# - 按下按钮时动态添加用户控件