Witam.
Z tego co "mówi" google, wynika, że jest to błąd spowodowany brakiem możliwości odbioru danych, z powodu zamknięcia połączenia. Jednak próbuje dojść do ładu z moim kodem i nie jestem w stanie tego naprawić. Poniżej przedstawię najważniesze fragmenty kodu. Dopóki któryś z klientów się nie rozłączy, wszystko działa, czyli do serwera może się podłączyć nieograniczona liczba klientów, jeśli klient łączy się z serwerem to każdy podłączony do serwera klient dostaje wiadomość o tym kto połączył się z serwerem. Każdy podłączony może wysyłać tekst, który pokazuje się na ekranach każdego podłączonego do serwera w danym momencie klienta. Jednak, gdy tylko jakiś klient się rozłączy, to komunikacja zaczyna szwankować (pojawia się błąd jak w temacie). Wysyłane wiadomości docierają nie do wszystkich podłączonych użytkowników. Czy jest mi ktoś w stanie podpowiedzieć, co jest nie tak?
//Server - klasa odpowiedzialna za komunikację
class ServerReadingStreamsThreadClass implements Runnable{
private Socket nowe_gniazdo;
private DataInputStream dane_wej;
private DataOutputStream dane_wyj;
private JTextArea okno_danych;
public static ArrayList<DataOutputStream> nowy_klient = new ArrayList<DataOutputStream>();
ServerReadingStreamsThreadClass(Socket nowe_gniazdo,JTextArea okno_danych){
this.nowe_gniazdo = nowe_gniazdo;
this.okno_danych = okno_danych;
}
public void run() {
String message;
try{
dane_wej = new DataInputStream(nowe_gniazdo.getInputStream());
dane_wyj = new DataOutputStream(nowe_gniazdo.getOutputStream());
nowy_klient.add(dane_wyj);
}catch (IOException e) {
e.getMessage();
}
while(true){
try{
while((message = dane_wej.readUTF())!=null){
Iterator ilu_podlaczonych = nowy_klient.iterator();
appendText("\n"+message);
while(ilu_podlaczonych.hasNext()){
dane_wyj = (DataOutputStream) ilu_podlaczonych.next();
dane_wyj.writeUTF(message);
}
}
}catch (IOException e) {
System.err.print("\nServer: "+e.getMessage());
}
}
}
//metoda pobierająca dane z pola_danych (metoda dostępna tylko dla jednego wątku)
public synchronized void appendText(String line){
okno_danych.append(line);
}
//metoda zamykająca połączenie
protected void finalize(){
try{
nowe_gniazdo.close();
System.out.print("Zamknięto nowe gniazdo");
} catch (IOException e) {
System.err.println("Nie można zamknąć gniazda");
System.exit(-1);
}
}
}
//Server: klasa wywołująca komunikacją i uruchamiająca server:
class ServerCommunicationClass {
private static ServerSocket server_socket;
private static DataOutputStream out_data;
//metoda odpowiedzialna za przyjmowanie połączeń (wielu połączeń)
public static void nowy_server_service(int port,JTextArea receive_field){
try{
server_socket = new ServerSocket(port);
receive_field.append("Serwer jest uruchomiony");
}catch (IOException e) {
e.getMessage();
}
while(true){
ServerReadingStreamsThreadClass serv_thr_class;
try{
serv_thr_class = new ServerReadingStreamsThreadClass(server_socket.accept(),receive_field);
Thread server_thread = new Thread(serv_thr_class);
server_thread.start();
}catch (IOException e) {
e.getMessage();
}
}
}
}
//Klient: Metoda Klienta (rozłączająca):
public void disconnect(){
try{
out_data.writeUTF("<"+user+">"+" jest niedostępny.");
in_data.close();
out_data.close();
client_socket.close();
}catch (IOException e) {
System.err.print("Client: "+e.getMessage());
}catch (NullPointerException e) {
System.err.print("Client: "+e.getMessage());
System.exit(-1);
}
}
Pozdrawiam