Przejmowanie komunikatów/strumienia z metody

0

Witam

Mam problem-pytanie.
Otóż mam program działający w stylu Klient-Serwer. Na Serwerze tworzę obiekt, w którym wywołuję metodę która nic mi nie zwraca (bo jest, i musi być voidem niestety).
Jednakże z tej metody wyświetlają mi się wyniki (System.out.println()). Chciałbym aby Serwer przesyłał mi te wyniki bezpośrednio do Klienta (w formie pojedynczego Stringa).
Zatem pytanie do was: Jak napisać, aby Serwer(Albo generalnie jakakolwiek program) przejmował wszystkie Stringi (wyniki) które są wysyłane przez metodę do konsoli i jak je zapisać na jednym Stringu w Serwerze tak aby ten bez problemu mógł przesłać Tego Stringa do Klienta? Dodam jeszcze że nie chcę (i nie mogę z resztą) ingerować w metodę która mi wyświetla właśnie wyniki w konsoli ponieważ w taki właśnie sposób ta metoda ma działać.

Z góry dziękuję za pomoc :)

0

System w javie ma taką ładną statyczną metodę setOut

Tak więc według dokumentacji to (teoretycznie) powinno zadziałać

final Socket socket = new Socket("trololo:localhost", 111);
final OutputStream os = socket.getOutputStream();
final PrintStream ps = new PrintStream(os);
System.setOut(ps);

pytanie tylko kto będzie robił flush - bo to nie zabezpiecza cię przed tym, że w strumieniu nie zostaną jakieś dane. I wgl, to co zaproponowałeś (takie chamskie przekierowanie standardowego wyjścia) jest dość biedne.

0

Można do tego problemu podejść na kilka sposobów. Podany przez @maryiusz jest fajny, bo prosty. Jeżeli chciałbyś przy okazji trochę się nauczyć innych rzeczy to polecam spróbowanie się z tematem WebSockets https://dzone.com/articles/sample-java-web-socket-client. Technologia jest "przyszłościowa" i na pewno warto ją poznać.

0

Dzięki wielkie za odpowiedź i pomoc :) Mimo wszystko mam jeszcze jedno pytanie. Udało mi się to zagadnienie rozwiązać w inny sposób (ostatecznie w końcu zrobiłem tak pewna metoda inna zwraca mi stringa). Wszystko niby działa elegancko to momentu aż chcę żeby ten string został przesłany z Serwera na Klienta. String zawiera "\n" więc czytając z in.readLine(); nie uzyskuję tego co bym chciał. Poszperałem na internecie i znalazłem pewne możliwości jak takie coś zrobić jednak mój klient zawiesza się gdy próbuje pobrać z Serwera informacje

try {
                String g=null;
                String get;
                while((get=in.readLine())!=null)
                    g+=get;
                    Treeprint.setText(g);
            }
            catch (IOException evt) {
                System.out.println("Read failed"); System.exit(1);
            } 

Dodam że pobieranie następuje w momencie gdy kliknę na przycisk w gui klienta (Chociaż wątpię czy to ma jakieś znaczenie dla sprawy, chociaż jak zauważyłem to klient się zawiesza w momencie właśnie naciśnięcia na przycisk). Dodam też jeszcze że in.ReadLine sam w sobie działa dobrze i np jak mam stringa :"1\n 2\n 3\n" to muszę nacisnąć na przycisk 3 razy aby wyświetliły mi się wszystkie linijki Stringa.

0
Przemoemo napisał(a):

Dzięki wielkie za odpowiedź i pomoc :) Mimo wszystko mam jeszcze jedno pytanie. Udało mi się to zagadnienie rozwiązać w inny sposób (ostatecznie w końcu zrobiłem tak pewna metoda inna zwraca mi stringa). Wszystko niby działa elegancko to momentu aż chcę żeby ten string został przesłany z Serwera na Klienta. String zawiera "\n" więc czytając z in.readLine(); nie uzyskuję tego co bym chciał. Poszperałem na internecie i znalazłem pewne możliwości jak takie coś zrobić jednak mój klient zawiesza się gdy próbuje pobrać z Serwera informacje

try {
                String g=null;
                String get;
                while((get=in.readLine())!=null)
                    g+=get;
                    Treeprint.setText(g);
            }
            catch (IOException evt) {
                System.out.println("Read failed"); System.exit(1);
            } 

Dodam że pobieranie następuje w momencie gdy kliknę na przycisk w gui klienta (Chociaż wątpię czy to ma jakieś znaczenie dla sprawy, chociaż jak zauważyłem to klient się zawiesza w momencie właśnie naciśnięcia na przycisk). Dodam też jeszcze że in.ReadLine sam w sobie działa dobrze i np jak mam stringa :"1\n 2\n 3\n" to muszę nacisnąć na przycisk 3 razy aby wyświetliły mi się wszystkie linijki Stringa.

Powtórz ten błąd - wklej kod - bez gui, sama logika.
Ale jak słyszę że "się zawiesza" to jestem pewien że zostawiłeś dane w strumieniu na które czeka ktoś czeka.

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