Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

readlin() mi prekida vezu sa serverom

[es] :: Java :: readlin() mi prekida vezu sa serverom

[ Pregleda: 1655 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Kursulla
Pancevo

Član broj: 94571
Poruke: 46
194.106.163.*



+1 Profil

icon readlin() mi prekida vezu sa serverom25.05.2009. u 15:40 - pre 181 meseci
Naime,

radim client socket komunikaciju i problem je sledeci:

client se zakaci na server i posalje mu poruku;
server iz strema (BufferedReader koristim) cita String;
client kada posalje string serveru, radi readLine() cekajuci ack odgovor od servera i tu dolazi do blokade!!!

Server cita sve dok se client ne blokira cekajuci na readline().


Inace,
client:


Socket clientSocket=new Socket(host,port);
OutputStream os=clientSocket.getOutputStream();
InputStream is=clientSOcket.getInputStream();

PrintWriter out=new PrintWriter(os);
BufferedReader in=new BufferedReader(new InputStreamReader(is));

out.write(msg);
out.flush();

String ack=in.readLine();


server

ServerSocket serverSocket=new ServerSocket(4005);
Socket clientSocket=serverSocket.accept();
InputStream is=clientSocket.getInputStream();
OutputStream os=clienSocket.getOutputStream();
BufferedReader in=new BufferedReader(new InputStreamReader(is));
PrintWriter out=new PrintWriter(os);

String temp="";
String str="";System.out.println("1");
while((temp=in.readLine())!=null){
System.out.println("Cita iz fajla!\n ");
str+=temp;
}
System.out.println(str);
out.write("Poruka primljena,ali je malo nejasna!!!");
out.flush();


Gde gresim?

 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
91.148.80.*

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: readlin() mi prekida vezu sa serverom25.05.2009. u 20:42 - pre 181 meseci
Predpostavljam da nigde nisi stavljao new line separator u stringove :)

znaci na kraju stringa fali ti \n , tj
Code:

"string sa znakom za novi red\n"


ili kad si vec napravio PrintWriter umesto write koristi println
 
Odgovor na temu

Kursulla
Pancevo

Član broj: 94571
Poruke: 46
194.106.163.*



+1 Profil

icon Re: readlin() mi prekida vezu sa serverom25.05.2009. u 21:55 - pre 181 meseci
Hm...sve savrseno radi kada client ne radi readLine().

Write odradjuej posao, ali pokusacu sa println.

Inace, string je xml dobijen serijalizacijom sa XStream klasom.


 
Odgovor na temu

Kursulla
Pancevo

Član broj: 94571
Poruke: 46
194.106.163.*



+1 Profil

icon Re: readlin() mi prekida vezu sa serverom26.05.2009. u 00:37 - pre 181 meseci
Probao,...ni da pipne!

Ima li jos koga da pomogne!?!?!?
 
Odgovor na temu

escape...
student
Bg

Član broj: 163295
Poruke: 37
194.106.160.*



+1 Profil

icon Re: readlin() mi prekida vezu sa serverom26.05.2009. u 11:19 - pre 181 meseci
Teško da neće ni da pipne, ako svako readLine() čita ono što mu je prosleđeno preko println().

Međutim, čini se da ovde postoji jedan drugi problem:
Code:

while((temp=in.readLine())!=null){
   System.out.println("Cita iz fajla!\n ");
   str+=temp;
}
System.out.println(str);
out.println("Poruka primljena,ali je malo nejasna!!!");
out.flush();


Priroda metode readLine() je da blokira program/nit u kojoj se izvršava sve dok se ne unese, tj. ne pročita neki red. Drugim rečima, nakon prijema prve poruke od klijenta (msg), uslov iz while petlje više nikada neće biti zadovoljen, jer metoda readLine() ne može vratiti null, tj. čeka dok se ne učita neka vrednost različita od null.

Dakle, problem ne pravi klijent sa readLine(), nego server sa while petljom. Server ostaje zaglavljen u njoj i ne stiže da pošalje odgovor, pa na taj način i klijent blokira čekajući poruku koja nikako da se pošalje.

Sve u svemu, while petlja koju koristiš nije adekvatan način da sačekaš da stigne poruka od serverske aplikacije - ako očekuješ jednu poruku od klijenta, dovoljno je da napišeš: temp = in.readLine(). Ako hoćeš da klijent i server u kontinuitetu razmenjuju više poruka, onda koristi petlje, ali uz neki drugi uslov (npr. neka logička varijabla čija se vrednost postavlja u zavisnosti od toga šta je klijent poslao), a samo iščitavanje obavljaj unutar petlje. Ako, pak, planiraš da realizuješ asinhronu komunikaciju (suprotno od: klijent šalje 1 poruku, pa server šalje 1 poruku, pa klijent šalje 1 poruku, i td.), predlažem da razmotriš korišćenje niti (na svakoj strani po jedna za prijem i jedna za slanje).



[Ovu poruku je menjao escape... dana 26.05.2009. u 12:37 GMT+1]
 
Odgovor na temu

Kursulla
Pancevo

Član broj: 94571
Poruke: 46
194.106.163.*



+1 Profil

icon Re: readlin() mi prekida vezu sa serverom26.05.2009. u 14:27 - pre 181 meseci
Ipak nije problem u tome.

Kako se meni si problem je sledeci:

Server ne stigne da izvuce sve podatke iz streama kada se klijent zakuca na readLine() i
kako se client zakucao, readLine na serverskoj strani ostane zakucan i da se nosi sve u ........

Ali sto je cudno, i kada taj readLine (na klijentskoj strani) radim u nezavisnoj niti problem i dalje postoji!?
 
Odgovor na temu

river
System Architect

Član broj: 12566
Poruke: 62
*.com
Via: [es] mailing liste



+1 Profil

icon Re: readlin() mi prekida vezu sa serverom26.05.2009. u 14:56 - pre 181 meseci
>

Poslusaj ljude, nemoj da odgovaras sa "ni da pipne"....
Evo ti kod sa komentarima pa ces ukapirati sta se desava:

*
Socket clientSocket=new Socket(host,port);
OutputStream os=clientSocket.getOutputStream();
InputStream is=clientSOcket.getInputStream();

PrintWriter out=new PrintWriter(os);
BufferedReader in=new BufferedReader(new InputStreamReader(is));

// Klijent sada upisuje i flushuje poruku, tj kako si rekao XML.
Pretpostavimo da taj xml ima vise od jedne linije
out.write(msg);
// Ovde se stream flushuje i to je dobro.
out.flush();

// Na jos uvek otvorenom socket-u klijent sad ceka da mu server vrati neku
poruku (liniju)
String ack=in.readLine();
*

server
*
ServerSocket serverSocket=new ServerSocket(4005);
Socket clientSocket=serverSocket.accept();
InputStream is=clientSocket.getInputStream();
OutputStream os=clienSocket.getOutputStream();
BufferedReader in=new BufferedReader(new InputStreamReader(is));
PrintWriter out=new PrintWriter(os);

String temp="";
String str="";System.out.println("1");

// Otvoreni su streamovi, klijent je nakacen. Sa pocetka price, klijent je
taj koji prvo posalje poruku serveru.
// server ovde cita poruku liniju po liniju.
// Cak i ako je XML dobro formatiran i ima n i na kraju poslednje linije
server u ovoj petlji uvek radi sledece:
// 1. Procita liniju ako je dostupna ako ne ceka dok linija ne postane
dostupna
// 2. napise po konzoli da cita
// 3. doda procitanu liniju na str
// 4. vrati se na korak 1
while((temp=in.readLine())!=null){
System.out.println("Cita iz fajla!n ");
str+=temp;
}

// Ovde server nikad nece da dodje posto nikad nece da izadje iz gornje
petlje
// a nece da izadje zato sto in.reradLine() ima da vrati null SAMO KAD DODJE
DO EOS-a
// tj kad se stream zatvori. U tvom slucaju to se nikad ne desava posto
klijent u tom trenutku
// ceka na server da mu posalje poruku, a server u isto vreme ceka na
klijenta da mu posalje poruku.

System.out.println(str);
out.write("Poruka primljena,ali je malo nejasna!!!");
out.flush();
*

E sad ako vec zelis da sve ovo radi tako (da klijent posalje fajl, zatim
saceka odgovor sa servera) moraces da dodas neki marker.
Npr, da posle pisanja fajla u stream upises jednu liniju kao npr
out.writeln("<<sending done>>");

A zatim da dodas liniju u while petlju na serveru koja prekida petlju
ukoliko se procitana linija zavrsava sa "<<sending done>>" npr
while((temp=in.readLine())!=null){
if (temp.endsWith("<<sending done">>")) break;
System.out.println("Cita iz fajla!n ");
str+=temp;
}

Probaj... pa javi ako je pomoglo.

--001485f63160b6bb0a046ad11893
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div><div class="gmail_quote">2009/5/26 Kursulla <span dir="ltr">&lt;<a href="mailto:[email protected]">[email protected]</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Ipak nije problem u tome.<br>
<br>
Kako se meni si problem je sledeci:<br>
<br>
Server ne stigne da izvuce sve podatke iz streama kada se klijent zakuca na readLine() i kako se client zakucao, readLine na serverskoj strani ostane zakucan i da se nosi sve u ........<br>
<br>
Ali sto je cudno, i kada taj readLine (na klijentskoj strani)  radim u nezavisnoj niti problem i dalje postoji!?<br><font color="#888888">
<br>
--<br>
<a href="http://www.elitesecurity.org/p2289756" target="_blank">http://www.elitesecurity.org/p...<div></div><div class="h5"><br>
<br>
Prijave/odjave: <a href="http://www.elitesecurity.org/liste" target="_blank">http://www.elitesecurity.org/liste</a><br>
<br>
Ne menjajte sledece dve linije ukoliko odgovarate putem emaila!<br>
esauth:365073:afff8e86a799097b80621baa3a16c295<br>
Everything should be made as simple as possible, but not simpler. - AA
 
Odgovor na temu

Kursulla
Pancevo

Član broj: 94571
Poruke: 46
194.106.163.*



+1 Profil

icon Re: readlin() mi prekida vezu sa serverom26.05.2009. u 23:48 - pre 181 meseci
"Radi,jebo ga patak..."


// Ovde server nikad nece da dodje posto nikad nece da izadje iz gornje
petlje
// a nece da izadje zato sto in.reradLine() ima da vrati null SAMO KAD DODJE
DO EOS-a

// tj kad se stream zatvori. U tvom slucaju to se nikad ne desava posto
klijent u tom trenutku
// ceka na server da mu posalje poruku, a server u isto vreme ceka na
klijenta da mu posalje poruku.


Ovo je bilo sve sto mi je trebalo! :D
Boldirani deo nisam znao!

Zahvaljujem na odgovorima i pomoci!


 
Odgovor na temu

[es] :: Java :: readlin() mi prekida vezu sa serverom

[ Pregleda: 1655 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.