[英]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.