2015-07-20 49 views
2

我有一个客户端/服务器连接通过tcp套接字连接到同一个无线网络,使用一个IP地址和端口,但如果两个IP地址设备由于DHCP改变?我怎么能发现其他设备?发现另一个设备与TCP套接字Android

我想如果只有一个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(); 
} 
+0

你的意思是你的其中一台设备是一台服务器,第二台设备是客户端?或者有两个客户端和一个服务器? – eleven

+0

有两个或更多的客户 –

回答

1

如果设备中的一个改变IP地址,你的插座将打破,所以你将无法发送新的IP。

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

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

看看kryonet。这是一个在java中进行网络连接的好方法。它有一个内置的主机发现,所以你可以尝试使用它。如果你不能使用它,因为你需要停留在原始套接字的顶端或任何原因,我建议你看看kryonet的来源,复制udp发现部分。

相关问题