簡體   English   中英

使用TCP Socket Android發現另一台設備

[英]Discover another device with TCP Socket Android

我有2個安卓設備上的tcp套接字連接到同一個無線網絡的客戶端/服務器連接,使用ip地址和端口,但如果兩個設備的ip地址因dhcp而改變怎么辦?做發現其他設備?

我想如果只有一個ip更改我可以告訴其他設備“這是我的新IP”,但如果兩個更改都不起作用,我正在考慮啟動從192.168.1.1到192.168.1.255的循環並發送使用新ip的消息,我不知道是否有更好的方法來執行此操作,或者循環的開始和結束?

//SERVER
private void server() {
    ServerSocket serverSocket;
    Socket socket;
    try {
        serverSocket = new ServerSocket();
        serverSocket.setReuseAddress(true);
        serverSocket.bind(new InetSocketAddress(2222));

        while (true) {
            try {
                socket = serverSocket.accept();
                Runnable connection = new ConnectionHandler(socket);
                new Thread(connection).start();

            } catch (EOFException e) {

            } catch (Exception e) {

            }
        }

    } catch (IOException e) {

    } catch (Exception e) {

    }

}
public class ConnectionHandler implements Runnable {
    private Socket socket;
    public ConnectionHandler(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
            final String message = (String)input.readObject();
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Message: " + message);
                    //Operate with message
                }
            });
            input.close();
            socket.close();
        } catch (IOException e) {
        } catch (ClassNotFoundException e) {
        }
    }
}

// CLIENT
public static synchronized void client(final String message, final String server_ip) {
    new Thread() {
        public void run() {
            Socket socket;
            try {
                ObjectOutputStream outputStream;
                SocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(server_ip), 2222);

                socket = new Socket();                    
                socket.setReuseAddress(true);
                socket.setKeepAlive(true);
                socket.connect(socketAddress, 250);                    

                outputStream = new ObjectOutputStream(socket.getOutputStream());
                outputStream.flush();

                outputStream.writeObject(message);
                outputStream.flush();

                outputStream.close();
                socket.close();                    
            } catch (UnknownHostException e1) {

            } catch (IOException e1) {

            } 
        }
    }.start();
}

由於您正在為Android開發。 您可以使用Android的WiFi直接實現,其中已包含對等點發現。

一旦發現了對等體,您就可以初始化連接並執行您想要做的任何事情,例如發送一些數據。 這部分與現有代碼的作用類似。

閱讀此處的文檔。 http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html

如果其中一個設備更改了IP地址,您的套接字將會中斷,因此您將無法發送新的IP。

我認為你應該嘗試實現一些udp廣播服務器發現。

基本上使用udp發現,您將在服務器上創建一個udp套接字。 每個客戶端將首先發送廣播udp消息。 服務器將響應taht消息,允許客戶端知道服務器IP地址。 當套接字中斷時,您可以重新發現主機以更新服務器IP。

看看kryonet 這是一個很好的,易於在java中聯網的庫。 它具有內置主機發現,因此您可以嘗試使用它。 如果你不能使用它,因為你需要保持原始套接字的頂部或任何原因,我建議你看一下kryonet的來源和udp發現部分的副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM