Channel close Poblem

  • Themenstarter Themenstarter MeinerEiner_80
  • Beginndatum Beginndatum
M

MeinerEiner_80

Hallo,
Programmiere gerade ein kleines Peer2Peer Netzwerk, und habe im moment das problem:
Wenn ich einen Dialog mit meinem Partner beenden moechte, cancel ich den zugehoerigen SelectionKey beim Selector und schliesse auch den Channel.
Leider bekommt der andere dann den zuletzt gesendeten Text immer wieder zugesendet.

um das mal mit code zu verdeutlichen :
der "Schliesser" führt dies aus :
Code:
public void closeConnection(SelectionKey connectionKey) {
	
		System.out.println("schliesse nun verbindung");
			try {
				connectionKey.cancel();
				connectionKey.channel().close();
				System.out.println(connectionKey.channel().isRegistered());
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
		
	}


Bei dem anderen kommt immer wieder der zuletzt gesendete Text an, trotz :
Code:
try{
	        	if ((itKey.readyOps() & SelectionKey.OP_WRITE) == SelectionKey.OP_WRITE) {
	        		SocketChannel sc = (SocketChannel)itKey.channel();
	        		ByteBuffer write = ((IOBuffer)(itKey.attachment())).getWriteBuffer();
	        		sc.write(write);
	        		write.clear();
	        		itKey.interestOps(SelectionKey.OP_READ);
	        		it.remove();
	        	}
	        	}
	        	catch(CancelledKeyException e){
	        		System.out.println("canceldkey exception");
	        		e.printStackTrace();
	        	}
Also, der key ist nicht mehr registiert, dennoch wird weitergesendet..

und nun die gegenseite , welche empfängt :
Code:
try{
	        	if ((itKey.readyOps() & SelectionKey.OP_READ) == SelectionKey.OP_READ) {
	        		SocketChannel sc = (SocketChannel)itKey.channel();
	        		ByteBuffer read = ((IOBuffer)(itKey.attachment())).getReadBuffer();
	        		read.clear();
	        		try{
	        			sc.read(read);
	        			read.flip();
	        			byte[] reading = read.array();
	        			gui.newMessageReceived(read.array(),itKey);
	        			read.clear();
	        		}
	        		catch(IOException e){
	        			e.printStackTrace();
	        			sc.close();
	        			gui.SessionClosed(itKey);
	        			itKey.cancel();
	    			 }
	        		it.remove();
	        	}
	        	}
	        	catch(CancelledKeyException e){
	        		System.out.println("canceldkey exception");
	        		e.printStackTrace();
	        	}

Hat jemand ne idee?
 
Zurück