You need to use a selector. First create a selector to receive events:
Selector selector = Selector.open()
ServerSocketChannel :
SelectionKey acceptKey = server.register(selector, SelectionKey.OP_ACCEPT);
( " " :
while(true){
int available = selector.select();
if(available == 0) continue;
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
while(keys.hasNext()){
SelectionKey key = keys.next();
keys.remove();
if(key.isAcceptable()) doAccept(key);
else if(key.isReadable()) doRead(key);
else if(key.isWritable()) doWrite(key);
}
doAccept(), doRead() doWrite(). accept Socket.
doAccept(SelectionKey key){
SocketChannel socket = ((ServerSocketChannel)key.channel()).accept();
socket.configureBlocking(false);
...
...
SelectionKey socketKey = socket.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE);
socketKey.attach(someSocketIndentifier);
}
, , , (, ). , , .
doRead(SelectionKey key){
MyIdentifierType myIdentifier = (MyIdentifierType)key.attachment();
myIdentifier.readTheData();
}
doWrite(SelectionKey key){
MyIdentifierType myIdentifier = (MyIdentifierType)key.attachment();
myIdentifier.getSocketHandler().writePendingData();
}
, ByteBuffer, SocketChannels read (ByteBuffer) ( ), .
, , , , :
class MyNetworkClass{
ByteBuffer writeBuffer = ByteBuffer.allocate(1024);
SocketChannel commchannel;
...
public void write(byte[] data){
...
}
public void writePendingData(){
commchannel.write(writeBuffer);
}
}
, , , , . , .