hilpers


  hilpers > comp.lang.* > comp.lang.java

 #1  
08.03.2010, 20:22
Czterysta Czwarty
Witam!

Pisze prosty komunikator na gniazdach i wątkach i napotkałem na
problem przy pisaniu klienta (a może problem jest z serwerem).

Testuję oba programy następująco:
1. odpalam serwer - pojawia się komunikat, że nasłuchuje na jakimś
porcie,
2. odpalam klienta - serwer informuje o przychodzącym połączeniu z
danego hosta
3. i teraz co się dzieje z klientem:

Client.java
public static void main(String[] args) throws IOException {

Socket connection;
connection = new Socket(SERVER_ADDR, LISTENING_PORT);
new ConnectionHandler(connection);
}

ConnectionHandler.java
public class ConnectionHandler extends Thread {

//...

ConnectionHandler(Socket connection) {
this.connection = connection;
System.out.println("Polaczono z serverem " +
connection.getInetAddress().getHostName() + "na porcie: " +
connection.getPort());
start();
}

public void run() {
try {
out = new
ObjectOutputStream(connection.getOutputStream());
out.flush();
in = new ObjectInputStream(connection.getInputStream());
do {
//-- available zwraca 0 --//
System.out.println(in.available());
try {
//----> tu jest problem: w tym miejscu program
staje, nie wiem co się dzieje ze strumieniem
message = (String) in.readObject();
System.out.println("server>" + message);
sendMessage("Hi my server");
//...
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
} while (!message.equals("bye"));

} catch (IOException ex) {
ex.printStackTrace();
} finally {
//tarzyj slady i zwiewaj :)
try {
in.close();
out.close();
connection.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

W zaznaczonym miejscu klient staje, nie wiem co się dzieje ze
strumieniem. Wiecie może w czym tkwi problem?

Kiedy po takim "zawieszeniu" zamykam klienta. Serwer wywołuje wyjątek
"SocketException: Connection reset".

Pozdrawiam
Tomek.
 #2  
08.03.2010, 21:15
Brzezi
pon, 08 mar 2010 o 22:22 GMT, Czterysta Czwarty napisał(a):

> Witam!
>
> Pisze prosty komunikator na gniazdach i wątkach i napotkałem na
> problem przy pisaniu klienta (a może problem jest z serwerem).


Sorry ze nie wglebialem sie w pytanie, ale chcialem tak tylko wtracic, ze
jezeli chcesz wygodnie i wydajnie oprogramowac komunikacje sieciowa, to
polecam bilbioteke Apache MINA, na prawde jest bardzo przyjemna, jest
bardzo elastyczna i daje mnustwo mozliwosci:

jako taka zacheta:
http://mina.apache.org/documentation.data/ACEU2007.pdf

Znacie moze jeszcze jakies godne polecenia bilbioteki do tego typu? moze
jeszcze cos lepszego od MINAy?

Pozdrawiam
Brzezi
 #3  
09.03.2010, 05:47
Michal Kleczek
Czterysta Czwarty wrote:

[ciach]
> public void run() {
> try {
> out = new
> ObjectOutputStream(connection.getOutputStream());
> out.flush();


A po co flush()? Jeszcze nic nie napisales. Moze tu jest problem?

> in = new ObjectInputStream(connection.getInputStream());
> do {
> //-- available zwraca 0 --//
> System.out.println(in.available());
> try {
> //----> tu jest problem: w tym miejscu program
> staje, nie wiem co sie dzieje ze strumieniem
> message = (String) in.readObject();


Nic sie nie dzieje. Klient czeka az serwer cos do niego napisze.
ObjectInputStream bedzie tak dlugo probowal czytac, az uda mu sie zrobic z
tego String.

[..]
> out.close();
> connection.close();
> } catch (IOException ex) {
> ex.printStackTrace();
> }
> }
> }
>
> W zaznaczonym miejscu klient staje, nie wiem co sie dzieje ze
> strumieniem. Wiecie moze w czym tkwi problem?


Patrz wyzej.

>
> Kiedy po takim "zawieszeniu" zamykam klienta. Serwer wywoluje wyjatek
> "SocketException: Connection reset".


Znaczy prawdopodobnie:
1. Nawiazujesz polaczenie
2. Klient czeka az serwer cos napisze
3. Serwer nic nie pisze tylko czeka az klient cos napisze.
4. Ubijasz klienta i czekajacy serwer jest uwolniony przez SocektException.

Czyli normalnie :)
 #4  
09.03.2010, 11:45
Czterysta Czwarty
On 9 Mar, 07:47, Michal Kleczek <klek> wrote:
> Nic sie nie dzieje. Klient czeka az serwer cos do niego napisze.
> ObjectInputStream bedzie tak dlugo probowal czytac, az uda mu sie zrobic z
> tego String.


Głupi ja! :)
Pisałem na podstawie kilku przykładów i nie zauważyłem, że i serwer i
klient czekają na wiadomość.

Dzięki za sugestię.
 #5  
09.03.2010, 16:43
jolz
>> out = new
>> ObjectOutputStream(connection.getOutputStream());
>> out.flush();

>
> A po co flush()? Jeszcze nic nie napisales.


Zapisal wolajac konstruktor ObjectOutputStream.
 #6  
10.03.2010, 07:29
Michal Kleczek
jolz wrote:

>>> out = new
>>> ObjectOutputStream(connection.getOutputStream());
>>> out.flush();

>>
>> A po co flush()? Jeszcze nic nie napisales.

>
> Zapisal wolajac konstruktor ObjectOutputStream.


Racja, zapomnialem o tej pulapce zastawionej przez Suna.
Podobne wątki
Co zrobić ze zrippowanym strumieniem (Mplayer)?

Mam kłopot z odtworzeniem fragmentów muzyki ściągniętych na dysk np. ze strony amazon.com (sample z płyt). Rippuje je tak: mplayer -dumpstream -playlist adres otrzymując w...

problem ze strumieniem

Mam problem ze strumieniem Otóż muszę odczytac zawartość pliku do pewnego miejsca znak po znaku i jeśli zrobię to tak for (i=0; i < poz1+1;...

problem ze strumieniem znaków

Witam szanownych grupowiczów Mam napisać program, który będzie poprawiał zadane ciągi znaków, i tak zamiast janKowalski ma być po korekcie Jan Kowalski. Potrafię...

Wycinanie elementów strumieniem wody

Cześć, fajny wynalazek! ;-) Może zrewolucjonizować modelarstwo!!! [..] Pozdrawiam Piotr [..]


Czasy w strefie GMT. Teraz jest 23:10. | Privacy Policy