Problem z obsługą wątków

0

Witam. Powiecie mi może co jest nie tak z tym kodem? Włączam serwer, klienta - wszystko ok, jest połączenie itd. Ale gdy coś się napisze na wejście klienta wątek nadawcy klinuje cały program. Ani nic nie wysyła na serwer (nie pojawia się stosowny komunikat) ani nie możemy nic wpisać. Po prostu koniec.

Kod klienta:

import java.net.*;
import java.util.Scanner;
import java.io.*;

public class Main {
    Scanner wysl = new Scanner(System.in);
    Socket gniazdo;
    BufferedReader czytelnik;
    PrintWriter pisarz;
    public static void main (String[] args){
        System.out.println("Witaj w prostym programie chatowym");
        Main dzialanie = new Main();
        dzialanie.doDziela();
    }
    public void doDziela(){
        konfiguracjaKomunikacji();
        Thread watekOdbiorcy = new Thread (new Wyswietlanie());
        watekOdbiorcy.start();
        Thread watekNadawcy = new Thread (new Wysylanie());
        watekNadawcy.start();
    }
    private void konfiguracjaKomunikacji(){
        try{
            gniazdo = new Socket("127.0.0.1", 5000);
            InputStreamReader czytelnikStrm = new InputStreamReader(gniazdo.getInputStream());
            czytelnik = new BufferedReader(czytelnikStrm);
            pisarz = new PrintWriter(gniazdo.getOutputStream());
            System.out.println("Obsługa sieci przygotowana");
        }
        catch (IOException ex){
            ex.printStackTrace();
        }
    }
    public class Wyswietlanie implements Runnable{
    public void run(){
        String wiadomosc;
        try{
            while (true){
                wiadomosc = czytelnik.readLine();
                System.out.println(wiadomosc);
            }
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
    }
}
    public class Wysylanie implements Runnable{
    public void run(){
        String doWysl;
            doWysl = wysl.nextLine();
            pisarz.println(doWysl);
    }
}
}

I kod serwera:

import java.io.*;
import java.net.*;
import java.util.*;

public class MainServ {

  ArrayList strumienieWyjsciowe;

  public class ObslugaKlientow implements Runnable {
    BufferedReader czytelnik;
    Socket gniazdo;
  
    public ObslugaKlientow(Socket clientSocket) {
      try {
        gniazdo = clientSocket;
        InputStreamReader isReader = new InputStreamReader(gniazdo.getInputStream());
        czytelnik = new BufferedReader(isReader);
          
      } catch(Exception ex) {ex.printStackTrace();}
    }

    public void run() {
      String wiadomosc;
      try {
        while ((wiadomosc = czytelnik.readLine()) != null) {
          System.out.println("Odczytano: " + wiadomosc);
          rozeslijDoWszystkich(wiadomosc);
    
        }
      } catch(Exception ex) {ex.printStackTrace();}
    }
  }

  public static void main (String[] args) {
    new MainServ().doRoboty();
  }

  public void doRoboty() {
    strumienieWyjsciowe = new ArrayList();

    try {
      ServerSocket serverSock = new ServerSocket(5000);

      while(true) {
        Socket gniazdoKlienta = serverSock.accept();
        PrintWriter pisarz = new PrintWriter(gniazdoKlienta.getOutputStream());         
        strumienieWyjsciowe.add(pisarz);

        Thread t = new Thread(new ObslugaKlientow(gniazdoKlienta));
        t.start();

        System.out.println("mamy polaczenie");
      }
               
    } catch(Exception ex) {
      ex.printStackTrace();
    }
  }

  public void rozeslijDoWszystkich(String message) {
    Iterator it = strumienieWyjsciowe.iterator();
    while(it.hasNext()) {
      try {
        PrintWriter pisarz = (PrintWriter) it.next();
        pisarz.println(message);
        pisarz.flush();
      } catch(Exception ex) {
        ex.printStackTrace();
      }
    } 
  } 
}
0

Włącz pod debuggerem i zobacz gdzie się "klinuje" ;]

0

Nic nie daje :(

0

Jak to nic nie daje? A co sie dzieje? Stuknij łaskawie kilka breakpointów i zapewniam cię że gdzieś się zatrzyma...

0

Wstukiwałem a debugger nic nie wyrzuca. Błąd musi być gdzieś w kodzie klienta, tylko ja go nie widzę :( Anyone?

0

Powiedz mi ze sobie żartujesz...
Co ci niby debugger miał wyrzucić? Ty wiesz do czego w ogole debugger służy? To nie jest taka magiczna maszynka która pokazuje ci gdzie jest w kodzie błąd. Wstaw w swoim kodzie breakpointy w miejscach w których przewidujesz ze może być bląd. Następnie odpal program w trybie debug i przeskakuj krokowo kolejne instrukcje programu aż zobaczysz gdzie program wpada w nieskończoną pętlę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1