Konflikt: Blocking und Non-Blocking bei Objekte versenden

Status
Nicht offen für weitere Antworten.

Angel4585

Bekanntes Mitglied
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

Bekanntes Mitglied
Also was ich bis jetzt gefunden hab ist folgendes:

Client
Code:
        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:
Code:
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

Bekanntes Mitglied
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 o_O
 

Angel4585

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

Angel4585

Bekanntes Mitglied
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.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben