NIO SocketChannel сбрасывает получение файла.
Привет! Разбираюсь с Java NIO.
Написал простой неблокирующий сервер, который принимает файлы, но иногда сервер не успевает получить новую порцию байтов, в результате чего раньше времени выходит из цикла.
1) В чем причина может быть и как ее устарнить?
2) Правильно ли использовать key.cansel() когда закончился прием файла, если не хочется закрывать канал к клиенту? Или тогда все равно будет потерян клиент из селектора?
Заранее спасибо.
```
public class CloudServer {
private final String HOST = "localhost";
private final int PORT = 11111;
private final int BUFFER_SIZE = 1024;
private Selector selector;
private InetSocketAddress address;
private ByteBuffer buffer;
public static void main(String[] args) throws IOException, InterruptedException {
new CloudServer().start();
}
public CloudServer() {
System.out.println("Create server...");
address = new InetSocketAddress(HOST, PORT);
buffer = ByteBuffer.allocate(BUFFER_SIZE);
}
public void start() throws IOException, InterruptedException {
System.out.println("Start server...");
selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.socket().bind(address);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Iterator keys = selector.selectedKeys().iterator();
while (keys.hasNext()) {
SelectionKey key = (SelectionKey) keys.next();
keys.remove();
if (key.isValid()) {
if (key.isAcceptable()) {
accept(key);
}
if (key.isReadable()) {
read(key);
}
}
}
}
}
private void accept(SelectionKey key) throws IOException {
System.out.println("Client connected...");
ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
SocketChannel socketChannel = serverSocketChannel.accept();
socketChannel.configureBlocking(false);
socketChannel.register(selector, SelectionKey.OP_READ);
}
private void read(SelectionKey key) throws IOException, InterruptedException {
System.out.println("Read data from client...");
SocketChannel socketChannel = (SocketChannel) key.channel();
String fName = "test1.txt";
Path path = Paths.get(fName);
int numRead = 0;
int size = 0;
try ( FileChannel fileChannel = FileChannel.open(path,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE,
StandardOpenOption.CREATE)) {
do {
numRead = socketChannel.read(buffer);
System.out.println("Bytes read: " + numRead);
buffer.flip();
if (numRead > 0) {
fileChannel.write(buffer);
size += numRead;
}
buffer.clear();
} while (numRead > 0);
}
key.cancel();
System.out.println("Bytes writed: " + size);
}
}
```
16 марта 2019 в 23:55