[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