ブロッキングとノンブロッキング・
伝統的なIOは、流れを遮断しています。すなわち、に読み取りまたは書き込まれるいくつかのデータがあるまで)((スレッド呼び出しが読んだとき)、または書き込み、スレッドはその間にスレッドが他のタスクを実行することができない、ブロックされています。したがって、通信ネットワーク入出力操作が完了すると、サーバは、クライアントごとに処理するための別々のスレッドを有していなければならないので、サーバが多数のクライアント、性能の急激な低下を処理する必要がある場合、スレッドは、ブロックされているため。
JavaのNIOは非ブロッキングモードです。スレッドは、チャネルからのデータを読み書きするときに使用可能なデータがない場合、スレッドは、他のタスクを実行することができます。スレッドは通常、別のスレッドが入出力複数のチャネルを管理するので、他のチャネル上のIOオペレーションを実行するためのIOアイドル時間を非ブロッキング。そのため、NIOは、サーバが同時にサーバーへのすべてのクライアント接続を処理するために、1つまたはスレッドの限られた数を使用することができます
ネットワーク通信を使用して完了NIO
ブロッキング:
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class BlockingNIOTest {
@Test
public void client() throws IOException {
//获取通道
SocketChannel sChannel=SocketChannel.open(new InetSocketAddress("127.0.0.1",9898));
FileChannel inChannel=FileChannel.open(Paths.get("文件路径"),StandardOpenOption.READ);
//分配指定大小的缓冲区
ByteBuffer buf=ByteBuffer.allocate(1024);
//读取本地文件,并发送到服务器
while (inChannel.read(buf)!=-1){
buf.flip();
sChannel.write(buf);
buf.clear();
}
//关闭通道
sChannel.close();
inChannel.close();
}
@Test
public void server() throws IOException {
//获取通道
ServerSocketChannel ssChannel=ServerSocketChannel.open();
FileChannel outChannel=FileChannel.open(Paths.get("文件路径"),StandardOpenOption.READ,StandardOpenOption.CREATE);
//绑定9898端口连接
ssChannel.bind(new InetSocketAddress(9898));
//获取客户端连接的通道
SocketChannel socketChannel=ssChannel.accept();
//分配指定大小的缓冲区
ByteBuffer buf=ByteBuffer.allocate(1024);
//接收客户端的数据,并报错到本地
while (socketChannel.read(buf)!=-1){
buf.flip();
outChannel.write(buf);
buf.clear();
}
//关闭通道
outChannel.close();
ssChannel.close();
socketChannel.close();
}
}