我通过tcp套接字连接到同一个无线网络的2个android设备上的客户端/服务器连接,使用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();
}
答案 0 :(得分:2)
因为您正在为Android开发。您可以使用Android的WiFi直接实现,其中已包含对等点发现。
一旦发现了对等体,您就可以初始化连接并执行您想要做的任何事情,例如发送一些数据。这部分与现有代码的作用类似。
请阅读此处的文档。 http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html
答案 1 :(得分:1)
如果其中一个设备更改了IP地址,您的套接字将会中断,因此您将无法发送新的IP。
我认为你应该尝试实现一些udp广播服务器发现。
使用udp发现Basicaly,您将在服务器上创建一个udp套接字。每个客户端将首先发送广播udp消息。服务器将响应taht消息,允许客户端知道服务器IP地址。当套接字中断时,您可以重新发现主机以更新服务器IP。
看看kryonet。这是一个很好的,易于在java中联网的库。它具有内置主机发现,因此您可以尝试使用它。如果你不能使用它,因为你需要保持原始套接字的顶部或任何原因,我建议你看一下kryonet的来源和udp发现部分的副本。