Отправка объектов с одного компьютера на другой через Интернет с помощью Hamachi
Я делаю приложение для чата, которое должно отправлять объекты на сервер, а сервер должен обрабатывать этот объект, чтобы получить IP-адрес назначения. Затем используйте IP-адрес, полученный от объекта, чтобы отправить этот объект в другой клиентский чат.
Приложение работает нормально, когда оба клиента подключены к одному и тому же маршрутизатору и к одной и той же сети Hamachi. Однако, когда они находятся в одной и той же сети hamachi, но подключены к разным маршрутизаторам, они оба подключаются к серверу, но только один клиент может отправлять сообщения. Когда другой отправляет сообщение, он достигает сервера, но сервер не может отправить эти сообщения клиенту назначения. (Сервер печатает тайм-аут).
Клиент отправляет объекты:
public class out {
public static void sendObject(Data data){
System.out.println(data.getDestinatario());
try {
Socket socket = new Socket(JOptionPane.showInputDialog("Introduce servers IP"),6666);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(data);
objectOutputStream.close();
socket.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(new JPanel().getParent(),e.getMessage());
}
}
public static void setOnline() throws Exception{
Socket puerto = new Socket(JOptionPane.showInputDialog("Introduce servers IP"),6363);
DataOutputStream dataOutputStream = new DataOutputStream(puerto.getOutputStream());
dataOutputStream.writeUTF(Registry.Registry.get(0).getName());
dataOutputStream.close();
puerto.close();}
}
Клиент получает объекты:
public class in {
public static void incomingObject(){
Thread checkMesage = new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
ServerSocket gate = new ServerSocket(9999);
ObjectInputStream objectInputStream = new ObjectInputStream(gate.accept().getInputStream());
Data data = (Data) objectInputStream.readObject();
Chat.messages.append(data.getName()+ ": "+ data.getMessage() + "\n");
objectInputStream.close();
gate.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
checkMesage.start();
}
Сервер получает объекты:
public class in {
public static void isOnline() throws Exception {
ServerSocket serverSocket = new ServerSocket(6363);
Thread isOnline = new Thread(new Runnable() {
@Override
public void run() {
while (true){
try {
Socket socket = serverSocket.accept();
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
Online.addOnline(new usuario(dataInputStream.readUTF(),socket.getInetAddress().getHostAddress()));
dataInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
isOnline.start();
}
public static void incomingObject(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
ServerSocket serverSocket = new ServerSocket(6666);
ObjectInputStream objectInputStream = new ObjectInputStream(serverSocket.accept().getInputStream());
Data data = (Data) objectInputStream.readObject();
System.out.println(data.getMessage());
objectInputStream.close();
serverSocket.close();
out.sendObject(data);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
});
thread.start();}
}
Сервер отправляет объекты:
public class out {
public static void sendObject(Data data){
System.out.println(data.getDir());
try {
Socket socket = new Socket(data.getDir(),9999);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(data);
objectOutputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}}
}