Tudna nekem valaki segíteni? Java-ban kellene egy megoldás arra, amikor a kliens egy megadott hoszt portjára kapcsolódik és addig olvas amíg a szerver adatokat küld. kb mint a telnet. nem kell a teljes program nekem csak az olvasási rész.
Másik dolog a szerver program hogyan tud úgy üzenetet küldeni, hogy a kliens a szerver formázását megőrizze és ha a küldött sztring végén van \n akkor kiíratáskor a szöveg után dobjon új sort, ha meg nincs akkor természetesen a következő kapott üzenetet ne kezdje új sorban. Értem ezalatt, hogy a szerver elküld egy üzenetet:
....
PrintStream out = new PrintStream(incoming.getOutputStream());
out.println("hello\n");
....
ezt a kliens veszi, majd System.out.print-tel kiírja vagy nem tudom mivel, de úgy, hogy a végén dobjon új sort.. vagyis ne a print/println döntse el, hogy legyen új sor kiíratásnál, hanem a string.
- 1442 megtekintés
Hozzászólások
Socket sock = new Socket(host,port);
BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
utána br.readLine()-nal olvasod, ameddig jól esik
öh, ez a \n-es dolog ez biztos kell hozzá?
- A hozzászóláshoz be kell jelentkezni
na ez az ami nem működik! nem addig akarok olvasni ameddig jólesik, hanem addig amig a szerver küld üzenetet! nem tudom előre, hogy 3sornyit küld, vagy 5sornyit, vagy egyet sem. az a lényeg, hogy ha küld, akkor olvassam, ha nem küld akkor menjen tovább a program.
- A hozzászóláshoz be kell jelentkezni
while?
egyébként mi az, hogy *amíg* küld? timeout-tal akarod, vagy mi?
- A hozzászóláshoz be kell jelentkezni
huhhh... igen while, de mi a feltétel? mikor tudom, hogy már nincs több? nem akarok timeoutot semmi extra, csak annyit akarok, hogy amíg a szervernek van mondandója, addig olvasson a kliens és ezt az üzenetet jelenítse meg a képernyőn a kliens. de nem tudom, hogyan lehet azt ellenőrizni, hogy van -e még új olvasnivaló. de oké.. te hogyan oldanád meg a readLine() metódussal, hogy ha nem tudod a küldendő sorok számát, akkor a program szépen működjön. mondjuk csinálja azt, hogy ha van mit beolvasni akkor olvas, ha nincs mit beolvasni akkor a kliens program a billentyűzetre vár onnan olvas, majd azt elküldi a szervernek majd újra vár a szervertől választ ami lehet 0, de lehet 50oldalnyi szöveg is. ha nincs válasz, akkor megint a kliens küld. pont mint a telnet esetén.
- A hozzászóláshoz be kell jelentkezni
Szerintem hasznalj valami speci karektert/karaktersort ami jelzi, hogy a szerver befejezte a mondandokajat.
- A hozzászóláshoz be kell jelentkezni
igen ez is felmerült bennem, de akkor ha telnettel próbálják akkor meg gázul fog kinézni.
- A hozzászóláshoz be kell jelentkezni
A speci karakterlanc lehet az is, hogy
######################################
## A szerver befejezte a mondokajat ##
######################################
Vagy valami hasonlo, ami meg nez is ki valahogy
- A hozzászóláshoz be kell jelentkezni
Esetleg a szerver lezarhatja a kapcsolatot, amikor nincs tobb mondanivaloja.
- A hozzászóláshoz be kell jelentkezni
de nem akarom lezárni a kapcsolatot :-) szeretnék olvasni a socketről, majd ha már nem küld adatot a szerver, akkor a kliens küldjön és így ciklikusan. a gondom csak az, hogy nem tudom leellenőrizni, hogy a szerver akar -e még küldeni. a readLine() az beolvas egy sort, ez jó.. ha tudom, hogy jött egy sor, de ha nem jött akkor vár..vár..vár és vár nem megy tovább. olyan olvasás kéne, ami addig olvas amig van mit. csak van tán ilyen. akkor ne sort olvasson, olvasson bájtot vagy karakter nekem tök mindegy, de vegye észre, ha már nincs mit olvasni. a szerver elküld egy üzenetet ami mondjuk 2sor. aztán a kliens küld valamit, majd erre válaszol vagy nem a szerver valamit. a telnet is észreveszi, hogy már nem jön semmi pl.
ez egy interaktív szerver-kliens kapcsolat lenne, ha a szerver mond valamit nem zárhatja le a kapcsolatot, majd a kliens elköszön és akkor zárja le.
- A hozzászóláshoz be kell jelentkezni
Van ám ottan abban a BufferedReaderben egy ready() metódus is, ami akkor ad truet, ha van valami a pufferben amit ki lehet olvasni. Ha olyan ciklust csinálsz, hogy a readLine() előtt ráhívsz erre és csak akkor olvasol ha van mit, akkor elvileg jó lesz, csak ez csúnya, mert +1 hívás minden iterációban.
Amit nem értek az az hogy a readLine() -nak elvileg mindig van specifikálva értéke - ha van valami a pufferben akkor az, ha nincs akkor meg null jön vissza. Halovány emlékeim (meg a doksi) szerint nincs olyan hogy várjon valamire, tutira nem valami ciklusod száll el itt?
- A hozzászóláshoz be kell jelentkezni
próbáltam ezt is, az első blokknál jól működött, de utána sosem tért vissza megfelelő értékkel a ready() így utána mindig úgy vette, hogy nincs mit olvasni.
- A hozzászóláshoz be kell jelentkezni
közben annyira azért rájöttem, hogy időzitésből adódó a probléma ezzel a ready() -vel. ugyanis olvasok amig ready, majd ezt soronként szépen kiirom. utána várok a billentyűzetre amit onnan beolvasok azt elküldöm a szervernek, majd megint várok, hogy olvasson, de ilyenkor szokott a ready() azzal visszatérni, hogy nincs mit. persze mivel a kérést elküldte de a szerver még nem tudott rá válaszolni.. na most ez a gon.
olvasok amig ready, amit olvastam azt kiirom a képernyőre (kliens):
while (cbufread.ready()) {
full = cbufread.readLine();
System.out.println(full);
}
//a billentyűzetről olvasok, amit beolvastam küldöm a szervernek
line = be.readLine();
cprnwrite.println(line);
cprnwrite.flush();
ez eddig megy is, de ha most csak próba képpen beszúrom ugyanezt a blokkot mégegyszer, akkor nem minden esetben csipi el a szerver válaszát:
tehát próbaképpen a blokk 2x egymás után, a kliens első kérésére a második while nem minden esetben kap ready() választ mivel gyorsabban lekérdezi a ready()-t mint ahogy a szerver feltöltené a buffert.
while (cbufread.ready()) {
full = cbufread.readLine();
System.out.println(full);
}
//a billentyűzetről olvasok, amit beolvastam küldöm a szervernek
line = be.readLine();
cprnwrite.println(line);
cprnwrite.flush();
while (cbufread.ready()) {
full = cbufread.readLine();
System.out.println(full);
}
//a billentyűzetről olvasok, amit beolvastam küldöm a szervernek
line = be.readLine();
cprnwrite.println(line);
cprnwrite.flush();
- A hozzászóláshoz be kell jelentkezni
Tedd szálba az olvasást, és ha végeztél az olvasás/írással csinálj valami keepalive forgalmat. Pl. küldesz bináris 0-t oda-vissza.
- A hozzászóláshoz be kell jelentkezni
Szerintem spec. karakternek a null is megteszi. Ha a BufferedReader / PrintWriter nem szereti, akkor használhatsz szerializációt a Stringek elküldésére. Ilyenkor a szerver jelezné egy nullal, hogy már nincs mit mondania.
_______________________________________________________________________
"If you must mount the gallows, give a jest to the crowd, a coin to the hangman, and make the drop with a smile on your lips" The Wheel of Time series
- A hozzászóláshoz be kell jelentkezni
Öhöm, csak egy ötlet: egy végtelen ciklusban olvasol (esetleg külön szálon), és amikor nem tud olvasni, akkor a BufferedReader nullt ad vissza, amit már lehet vizsgálni.
Valami ilyesmi:
while (true)
{
String line = bf.readLine();
if (line != null)
{
//Ekkor csinálsz vmit
}
else
{
//Ekkor meg befejezed.
break;
}
}
Szerk.:
Opsz, most látom, félreértettem a dolgot, elnézést.
_______________________________________________________________________
"If you must mount the gallows, give a jest to the crowd, a coin to the hangman, and make the drop with a smile on your lips" The Wheel of Time series
- A hozzászóláshoz be kell jelentkezni