【问题标题】:Discover another device with TCP Socket Android使用 TCP Socket Android 发现另一台设备
【发布时间】:2015-07-20 16:13:28
【问题描述】:

我在 2 个 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();
}

【问题讨论】:

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

标签: java android sockets tcp


【解决方案1】:

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

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

在此处阅读文档。 http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      • 2014-07-30
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      相关资源
      最近更新 更多