【问题标题】:How to send data from Node to another server如何将数据从 Node 发送到另一台服务器
【发布时间】:2018-10-01 07:04:40
【问题描述】:

我正在尝试找出一种将 Node 用作客户端的方法,该客户端会将数据发送到侦听 Android 应用程序的服务器。 android 应用程序最初将使用其公共 IP 地址和它将侦听的端口(套接字)向 Node 服务器发送一个 post 请求。一旦有任何新的东西,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;
    }
}

【问题讨论】:

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


    【解决方案1】:

    是的,您可以在 Node.js 中执行此操作,假设应用程序运行在实际上可公开访问的手机上。由于您在 Android 应用程序中使用的是普通 TCP 套接字,因此您可以先使用netcattelnet 等工具手动连接套接字来验证(例如,netcat &lt;PUBLIC-IP&gt; 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 应用程序通常如何实现推送通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 2013-12-03
      • 2015-06-25
      • 1970-01-01
      • 2021-10-22
      • 2018-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多