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 :
Bei dem anderen kommt immer wieder der zuletzt gesendete Text an, trotz :
Also, der key ist nicht mehr registiert, dennoch wird weitergesendet..
und nun die gegenseite , welche empfängt :
Hat jemand ne idee?
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();
}
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?