TCP/ip komunikator

0

Witam mam problem jestem początkujący w Javie i chciałbym używając swinga do okienek zrobić prosty komunikator tcp/ip. Serwer już mam gotowy w c. Projekt polega na tym ze będzie okienko do wysyłania i drugie do odbierania wiadomości z serwera. Problem jest taki ze powinien cały czas czekać na nadchodzące wiadomości z serwera i odpalenie dwóch tych rzeczy nara powoduje blokadę... Nigdy nie operowałem na watkach stąd prośba o pomoc...

kod clasy klient sa 2 metody jedna do czytania read ona ma byc odpalona w nieskonczonej petli i przekaywac appendem do jednego okna wartosci i druga do pisania wywoływana po kliknieciu przycisku wyslij

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

public class client extends Thread {        
Socket socket = null;
PrintWriter out = null;
BufferedReader in = null;
public client(String serveraddress, int sock){



		BufferedReader read = new BufferedReader(new InputStreamReader(System.in));

        try {
            socket = new Socket(serveraddress, sock);
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection");
            System.exit(1);
        }
		System.out.println("Connected");
   }
public String read() throws IOException{
if(in.ready()){
return in.readLine();}
else return null;
}
public void write(String tekst, String nick){
out.println(nick+": "+tekst);

} 
public void run(){
    
    
    
    
}

}
0

Nie tak. Client powinien posiadać dwa obiekty Writer do wysyłania i Reader do czytania. Blokada wynika z faktu, że obie te metody działają w ramach jednego wątku. Pętla blokuje się czekając na read. Rozbij ten obiekt na dwa wcześniej wspomniane Writer i Reader oraz obiekt główny.

0

A nie moge odpalic 2 takich samych watków i wywołac w jednym ta metode w drugim ta np nazywajac klasy client i client2

0

Teoretycznie tak. Jednak masz wtedy złamaną zasadę SRP:
http://koziolekweb.pl/2009/02/26/solidne-programowanie-czesc-1-czyli-monogamia/
Tu masz przykładowy "modem", czyli coś co wysyła i pobiera informacje. Masz tam klasę spinającą i klasy, które realizują różne funkcje - nawiązanie połączenia, wysyłanie i odbieranie wiadomości itp. Klasa powinna mieć rozsądny zakres odpowiedzialności. Jeżeli tworzysz obiekt, który tylko wysyła dane do serwera to po co mu metoda odbierająca? Jeżeli tworzysz listener to nie ma on za zadanie wysyłać wiadomości.

0

chodzi o to ze to raczej taki czat bedzie i kazdy podłaczony dostaje wszystkie wiadomosci dlatego zadnych synchornizacji niepotrzebujemy ale przerobiłem tak jak mowiłes kazda klasa sie łaczy osobno. zastanawiam sie rtylko cy cos do run musze wrzucac bo nie wiem...

TO znaczy ze w reader.java usunełem funkcje write a w writer.java read

0

W run() uruchamiasz prace wątku. Ja bym to zrobił tak, że reader działa bez przerwy:

public void run(){
   while(runnung){
     read();
  }
}

A writer jest tworzony w razie czego i nie działa bez przerwy.
Co to jest running? Jeżeli będziesz kończył aplikację to należy ją jakoś zamknąć. Jeżeli dasz true to pętla będzie wykonywała się w nieskończoność, a wątek się zablokuje. Jeżeli dasz możliwość zmiany flagi to po pojedynczej operacji czytania pętla zobaczy zmianę flagi, a wątek bezpiecznie się zakończy.

0

Tylko jak przekazac to co zwraca read do tekst area w swingu jak co chwila bedzie zwracana wartosc i napisywana?

0

ha... tu leży pies pogrzebany ;) Pierwszy krok to wzorzec obserwatora. Niech Reader informuje komponent o zmianie stanu. Druga rzecz to aktualizacja stanu. Pytanie chcesz pełną historię czy ostatni wpis?

0

chcĘ by nabierzaco dodawało wpisy nie usuwajac poprzednich

Koziołek napisał(a)

W run() uruchamiasz prace wątku. Ja bym to zrobił tak, że reader działa bez przerwy:

public void run(){
   while(runnung){
     read();
  }
}

to mi netbeans nie kompiluje...

0

bo to jest tylko poglądowy kod. Niestety mam zasadę, że gotowce robię za kasę ;)

Co do dodawania na bieŻąco (Boże, widzisz takie błędy i nie grzmisz)

public void invokeOnLastMessage(String lastMessage){
textArea.setText(textArea.getText()+"\n"+lastMessage);
}

prośba zarejestruj się i będziesz miał opcję edycji postów, bo mogę je łączyć, ale to trochę problematyczne jest :)

0

Skoro każdy podłączony klient ma widzieć wszystkie wpisy innych klientów, to tak jak napisano wcześniej pasuje użyć wzorca obserwator (observer pattern), pogoogluj trochę przykładów jego jest mnóstwo, póżniej każdy nowo podłączany klient rejestruje się na serwerze w roli obserwatora, gdy nadejdzie wiadomość od jakiegoś klienta serwer powiadama wszystkich swoich obserwatorów, klient czeka na nadchodzącą wiadomość, gdy pojawi się ona na wejściu dodaje ją do textarea, nie wiem czemu strumienie mają się blokować, patrząć na tutorial suna da się to prościej zrobić, ale możesz zrobić dwa osobne wątki odpowiedzialne za nadawanie i odbiór, jak tak bardzo chcesz.

http://www.developer.com/java/ent/print.php/1356891 < - minuta googlowania, to naprawdę nie boli:)

to myślę pomocny link, sam nie mam czasu się w to za bardzo wczytywać ale jestem przekonany że to Ci pomoże, oczywiście musisz trochę poznać teorię obserwatora żeby to zakumać, skodzić tego też nie mam czasu (ale to nie jest trudne, wzór już jakiś masz), choć lubię, bo sam zajmuje się teraz z przymusu będącą na chyba już na wymarciu corbą.

Pozdrawiam

0

no juz z tym sobie poradzi  m zostaje mi kwestia scrollowania w jednym okienku nie wiem jak ja uruchomic textarea () w swingu

0

-----> google -----> jscrollpane tutorial :|

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