public class Main {
private static final String SERVER_IP = "localhost";
private static final int SERVER_PORT = 4444;
public static void main(String[] args) {
try {
Socket socket = new Socket(SERVER_IP, SERVER_PORT);
System.out.println("Connected to server, starting as client...");
Client client = new Client();
} catch (IOException e) {
System.out.println("No active server, starting as server...");
Server server = new Server();
}
}
}
Program startujesz w jednym procesie, w kodzie, który dostarczyłeś, wszystko jest uruchamiane w jednym wątku głównym (tzw. "main thread"). Jeśli obiekt klienta (Client) i serwera (Server) są uruchamiane w tym samym wątku, zazwyczaj może, ale nie musi, to prowadzić do problemów z synchronizacją, zwłaszcza jeśli są one związane z operacjami wejścia/wyjścia (I/O), takimi jak operacje na socketach,
Druga sprawa to fakt, że nie masz gwarancji tutaj że klient (Client) bedzie dzialal poprawnie, skoro jest uruchamiany bez oczekiwania na połączenie z serwerem. W twoim kodzie, klient jest inicjalizowany bez sprawdzania, czy połączenie z serwerem zostało ustanowione pomyślnie.
W przypadku aplikacji sieciowej zazwyczaj zaleca się korzystanie z wielowątkowości, aby uniknąć blokowania się operacji I/O.
Sprawdź zachowanie w taki sposó:
public class Main {
private static final String SERVER_IP = "localhost";
private static final int SERVER_PORT = 4444;
public static void main(String[] args) {
Thread serverThread = new Thread(() -> {
try {
System.out.println("Starting as server...");
Server server = new Server();
} catch (IOException e) {
e.printStackTrace();
}
});
Thread clientThread = new Thread(() -> {
try {
Socket socket = new Socket(SERVER_IP, SERVER_PORT);
System.out.println("Connected to server, starting as client...");
Client client = new Client();
} catch (IOException e) {
e.printStackTrace();
}
});
serverThread.start();
clientThread.start();
}
}
chociaż to też może prowadzić do błędnych odczytów, gdy nie ma odpowiedniej synchronizacji zasobu, ewentualnie wątki nie pracuja na danych bezposrednio z pamięci tylko cache