[Java lista] tcp kliens nio-val

Zsombor gzsombor at gmail.com
2007. Aug. 25., Szo, 22:37:00 CEST


On 8/25/07, Zidarics Zoltan <zamek at vili.pmmf.hu> wrote:
>
> hello,
>
> Szoval, ha open/get/close modon hasznalom, akkor mukodik, de ha nem akkor
> tolem (java prg) nem megy ki a keres.
>
> itt a kodreszlet:
>
>                         if (channel == null || !channel.isConnected())
>                                 open();
>                         try {
>                                 deviceReady = transmitDeviceData();  //
> kerest kikuldjuk
>                                 if (WAIT_AFTER_TRANSMIT >
> 0)                    // varunk, amig a hw feldolgozza a kerest
>                                         Thread.sleep(WAIT_AFTER_TRANSMIT);
>                                 if
> (deviceReady)                                        // ha kiment a keres
> olvassuk vissza a valaszt
>                                         deviceReady =  readDeviceData();
>                         }
>                         finally {
>                                 // channel.close();
>                         }
>
> a channel egy SocketChannel. a transmitDeviceData() kuldi ki a kerest:
>
> protected boolean transmitDeviceData() {
>   transmitBuffer.clear();
>   transmitData.getTransmitData(transmitBuffer); // keret eloallitasa
>   transmitBuffer.flip();
>   try {
>         int writes = channel.write(transmitBuffer);
>         return writes > 0 ? true : false;
>   }
>   catch (Exception e) {
>         return false;
> }
> }
>
> Ez mar nem megy ki masodszorra, csak akkor, ha minden keres utan close-al
> zarom a kapcsolatot. A masodik hivas utan a broken pipe exception-t kapok.
>
> Valami meg hianyzik, ugy erzi, hogy az elozo kuldes meg nem ment ki, vagy
> valami ilyesmi lehet.



Ha NIO-t használsz akkor arra figyelni kell, hogy nem feltétlenül megy el a
teljes buffer tartalma, úgyhogy az az ellenörzés, hogy az elküldött tartalom
több mint 0 nem jelent semmit. Illetve, ha nem ment el elsőre, akkor késöbb
meg kell hivni, újra a - félig meddig már elküldött - bufferrel. Pontosabban
ilyenkor Selector-t kell használni és ott figyelni az irhatóságra.
Egyáltalán, miért akarsz NIO-t használni, ilyen feladatra  jóval könnyebb és
használhatóbb egy hagyományos blokkoló socketet igénybe venni.

Zsombor
--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: http://javagrund.hu/pipermail/javalist/attachments/20070825/c5fba9cb/attachment-0001.html 


További információk a(z) Javalist levelezőlistáról