# Konflikt: Blocking und Non-Blocking bei Objekte versenden



## Angel4585 (28. Nov 2007)

Hallo,

wie im andern Thread besprochen steige ich wohl von RMI wieder um auf Sockets, bzw SocketChannels.

Jetzt habe ich allerding ein kleines Problem:

Der SocketChannel auf dem Client soll Non-Blocking sein. also 

sc.configureBlocking(false);

jetzt mochte ich jedoch Objekte zum Server schicken, bzw vom Server zum Client.

Wenn ich jetzt jedoch 

ObjectOutputStream oos = new ObjectOutputStream(sc.socket().getOutputStream());

mache und versuche zu versenden bekomme ich den Fehler:

Exception in thread "AWT-EventQueue-0" java.nio.channels.IllegalBlockingModeException

klar, denn dieser ObjectOutputStream arbeitet Blocking.

Also wie kann ich Non-Blocking Objekte versenden?


----------



## Angel4585 (28. Nov 2007)

Also was ich bis jetzt gefunden hab ist folgendes:

Client

```
ByteArrayOutputStream baos = new ByteArrayOutputStream();        
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(meo);
        sc.write(ByteBuffer.wrap(baos.toByteArray()));
```

Damit wird scheinbar ein Object in ein ByteBuffer gepackt und versendet.

Das Problem ist jetzt allerdings das Empfangen. Beim Server wird kein Ereignis oder so ausgelöst, also kein Key im Selector angelegt, obwohl der SocketChannel dort folgendermaßen registriert wird:

```
sc.register(sel,SelectionKey.OP_READ|SelectionKey.OP_WRITE);
```

EDIT: der Aufruf der Methode write liefert übrigens "81" zurück, also werden auf jedenfall schonmal Daten verschickt


----------



## Angel4585 (29. Nov 2007)

Ach ich hab vergessen den SocketChannel beim Server in die Liste einzutragen :roll:

Aber jetzt bekomm ich keine korrekte Verbindung hin.

Der Server meldet das er connected ist, der Client sagt er ist nicht connected


----------



## Angel4585 (29. Nov 2007)

Wichtig bei Non-Blocking: nach dem connect() des SocketChannels sollte man noch finishConnect() ausführen.


----------



## Angel4585 (29. Nov 2007)

Einen Disconnect bekommt man folgendermaßen mit:

Führt der Client ein close() aus, so wird beim Server ein READ Event beim Selector eingetragen.
liest man jetzt in diesem Ereignis per read(ByteBuffer) Daten ein, liefert die read()- Methode -1 zurück. Diese -1 wird scheinbar nur in diesem Fall zurückgegeben und ist daher eindeutig einem Disconnect zuzuordnen.


----------

