Java 发现另一个使用TCP套接字的设备

Java 发现另一个使用TCP套接字的设备,java,android,sockets,tcp,Java,Android,Sockets,Tcp,我在连接到同一无线网络的两个android设备中通过tcp套接字建立了客户机/服务器连接,该设备使用ip地址和端口,但如果两个设备的ip地址都因dhcp?而改变,我如何发现另一个设备 我想,如果只有一个ip更改,我可以告诉另一个设备“这是我的新ip”,但如果两个更改都不起作用,我会考虑从192.168.1.1到192.168.1.255启动一个循环,并用新的ip发送消息,我不知道是否有更好的方法,或者循环的开始和结束是什么 //SERVER private void server() {

我在连接到同一无线网络的两个android设备中通过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();
}

如果其中一个设备更改了ip地址,您的套接字将断开,因此您将无法发送新的ip

我认为您应该尝试实现一些udp广播服务器发现

基本上,通过udp发现,您可以在服务器上创建udp套接字。每个客户端将通过发送广播udp消息启动。服务器将响应taht消息,允许客户端知道服务器ip地址。当套接字中断时,您可以重新发现主机以更新服务器ip


看一看。这是一个很好的、简单的java网络库。它具有内置的主机发现功能,因此您可以尝试使用它。如果您因为需要保留原始套接字或其他原因而无法使用它,我建议您查看kryonet的源代码,并复制udp发现部分。

,因为您是为Android开发的。您可以使用android的WiFi直接实现,它已经包括对等发现

一旦发现对等点,您就可以初始化连接并执行任何您想要执行的操作,例如通过网络发送一些数据。这一部分将与现有代码所做的类似

请阅读此处的文档。

您的意思是,您的一台设备是服务器,另一台是客户端?或者有两个客户端和一个服务器?有两个或更多客户端