传统BIO的缺点/NIO的设计理念 使用NIO实现并发Demo
传统BIO的缺点:
- 在accept的时候会作出放弃CPU的操作 线程阻塞
- 在socket.getInputStream.read();的时候会造成线程阻塞
- BIO想实现并发需要采用多线程的方式 但是多线程有很多缺点(最大的缺点:消耗程序资源)
传统BIO服务器NetServer.class代码
public class NetServer {
static byte []bytes=new byte[1024];
public static void main(String[] args) {
try {
ServerSocket serverSocket=new ServerSocket(9098);
while (true) {
System.out.println("accept wait coon");
Socket socket = serverSocket.accept();
System.out.println("conn success");
System.out.println("read wait conn");
//放弃CPU
int read = socket.getInputStream().read(bytes);
System.out.println(read+"========这是read的长度");
System.out.println("data success");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
传统BIO客户端NetClient.class代码
public class NetClient {
public static void main(String[] args) {
try {
Socket socket=new Socket("127.0.0.1",9098);
Scanner scanner=new Scanner(System.in);
String next = scanner.next();
socket.getOutputStream().write(next.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
NIO的设计理念: 使用单线程实现高并发
针对传统BIO的缺点,sun公司推出了NIO
Nio Demo
package crawler.Socket;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName NioTemp
* @Description TODO
* @Author XuWenXiao
* @Date 2020/5/15 9:47
* @Version 1.0
**/
public class NioTemp {
static ByteBuffer byteBuffer=ByteBuffer.allocate(512);
static List<SocketChannel> socketChannels=new ArrayList<SocketChannel>();
public static void main(String[] args) {
try {
ServerSocketChannel serverSocket=ServerSocketChannel.open();
SocketAddress socketAddress=new InetSocketAddress("127.0.0.1",9098);
serverSocket.bind(socketAddress);
//设置accept为非阻塞
serverSocket.configureBlocking(false);
while (true){
for (SocketChannel socketChannel : socketChannels) {
int read=socketChannel.read(byteBuffer);
if (read>0){
System.out.println(read+"读取到数据的长度 read ");
byteBuffer.flip();
byte[]bytes=new byte[read];
byteBuffer.get(bytes);
String s=new String(bytes);
System.out.println(s);
byteBuffer.flip();
}
}
SocketChannel accept=serverSocket.accept();
if (accept!=null){
System.out.println("conn success");
//设置read 操作为非阻塞
accept.configureBlocking(false);
socketChannels.add(accept);
System.out.println(socketChannels.size()+"打印集合的长度 socketChannels.size()");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
本文作者:张三Blog
本文链接:https://www.cnblogs.com/zhangsan-plus/p/16503325.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步