繁体   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