簡體   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