繁体   English   中英

如何在Android中创建侦听localhost端口的套接字

[英]How to create a socket that listens a localhost port in Android

在解释我的疑问之前,我要提到这种冲突中有三个“参与者”:

  • 在某些服务器上执行的桌面程序
  • 通过计算机远程使用此程序的人
  • 还有一个通过USB与计算机连接的Android平板电脑应用程序

当该人单击该程序中远程使用的链接栏时,将有一个Shell脚本将一个字符串发送到该人的计算机端口(例如1100)。 要求是:从桌面获取此字符串后,将其发送到平板电脑。

那么,从台式机到平板电脑获取此字符串的最佳方法是什么?

现在,正在侦听1100端口的台式计算机中运行着一个Java守护程序。 这个Java应用程序可以作为台式机和平板电脑之间的中介,但是我认为也许有一种方法可以删除此守护程序,而只是使用平板电脑获取创建套接字的计算机数据。

您还可以在Android中实现Java套接字。 就像在Android中的“桌面套接字”上一样,它侦听端口,但这将在本地访问,因为没有将静态可用IP分配给Android设备的方法。

还有另一种解决方案,那就是socket.io Socket.io是我用过的最好的套接字库之一。 在Node.js服务器和Android上实现socket.io只需连接到Node.js服务器,您就可以向所有连接的用户发送相同的字符串,无论它是台式机还是Android。

private class ServerThread extends Thread {

    @Override
    public void run() {
        try {
            serverSocket = new ServerSocket(portNumber);

            while (true) {
                try {
                    clientSocket = serverSocket.accept();
                } catch (IOException e) {
                    LOGGER.error("Error on accept!");
                }
                // new thread for a client
                new EchoThread(clientSocket).start();
            }

        }catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

public class EchoThread extends Thread {
    protected Socket clientSocket;
    BufferedReader br = null;

    public EchoThread(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }

    public void run() {
        try {
             br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        } catch (IOException e) {
            ...
        }

        isConnected = true;

        while (isConnected) {
            try {
                receivedMessage = br.readLine();
                if (!Strings.isNullOrEmpty(receivedMessage)) {
                    ....
                }
                else {
                    //sleep 0,1s
                    //TODO (ver): Thread.sleep(100);
                }
            } catch (Exception e) {
                if (e instanceof IOException) {
                }
                else if (e instanceof JsonSyntaxException){
                }
                else {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException inte) {
                        inte.printStackTrace();
                    }
                }
            }

            if (//yourmessagecondition){
                isConnected = false;
            }
        }
        if (!isConnected){
            try {
                br.close();
                clientSocket.close();
            }catch (IOException ioe){
                ioe.printStackTrace();
            }
        }
    }
}

希望对您有所帮助,它在这里可以正常工作...您可能会在Internet上找到更简单的示例。 PS:如果您使用USB电缆与计算机应用程序通信,则可以使用“ adb forward”命令,只需在google上找到一些示例,并在有帮助的情况下接受此答案即可;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM