[Java lista] tcp kliens nio-val
Zidarics Zoltan
zamek at vili.pmmf.hu
2007. Aug. 26., V, 11:06:19 CEST
hello,
2007. augusztus 26. 10.17 dátummal nbatfai at inf.unideb.hu ezt írta:
> A szerver oldalon még lehet nio. Bár a levelezésből kitűnik,
> hogy a szerver oldalon már túl vagy, de a
Illetve azt nem en csinalom, hanem egy celhardware.
> http://www.inf.unideb.hu/~nbatfai/ProgramozoPaternoszter.pdf
> vannak C és Java nem blokkolódó, IO multiplexelt példák.
Atirtam hagyomanyos modszerre, de az eredmeny ugyanaz :(
Ha minden lekerdezes elott/utan van open/close, akkor mukodik, egyebkent
broken pipe. Illetve, az elso esetben connection reset exception, aztan a
kovetkezore mar broken pipe.
Eloszor a hardware-re gyanakodtam, de ngrep-pel monitorozva a kimenetet, a
kovetkezot latom:
Elso keres: kimegy rendesen, a hw valaszol is ra, es tudom is olvasni a
valaszt.
Masodik keres: ki sem megy a write, kapok egy connection reset exception-t
Harmadik kerestol: broken pipe exception.
Ebbol arra kovetkeztetek, hogy nalam van valahol a hiba. Ha ujrainditom a
programot, akkor a hw minden esetben valaszol, minden beavatkozas nelkul.
Az ominozus kodreszlet:
try {
if (connection == null || connection.isClosed())
open();
try {
transmitBuffer.clear(); // puffer torles
deviceReady = transmitDeviceData(transmitBuffer); // adatfeltoltes
if (deviceReady) {
byte[] buf = transmitBuffer.array();
connection.getOutputStream().write(buf); // megy ki
connection.getOutputStream().flush();
}
if (WAIT_AFTER_TRANSMIT > 0) // hw feleledesi ido
Thread.sleep(WAIT_AFTER_TRANSMIT);
if (deviceReady) {
byte[] buf = new byte[getReceiveCapacity()];
connection.getInputStream().read(buf);
receiveBuffer = ByteBuffer.wrap(buf);
deviceReady = readDeviceData(receiveBuffer);
}
}
finally {
// connection.close(); // ha ez be van kapcsolva, jol mukodik.
}
}
catch (Exception e) {
...
az open fuggveny:
protected void open() throws IOException {
connection = new Socket( InetAddress.getByName(host), port);
if (connection != null) {
connection.setKeepAlive(true);
transmitBuffer = ByteBuffer.allocate(getTransmitCapacity());
receiveBuffer = ByteBuffer.allocate(getReceiveCapacity());
}
}
A ByteBuffer-t megtartottam, mert nagyon kenyelmes.
koszi,
--
Zoltan Zidarics programmer
PTE University Pecs, Hungary
icq: 43288694
További információk a(z) Javalist levelezőlistáról