从bio到nio到netty实现原理浅析
Java资料站
共 20513字,需浏览 42分钟
· 2021-05-23
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
public class SocketServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器已经启动!");
// 接收客户端发送的信息
Socket socket = server.accept();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info = br.readLine()) != null) {
System.out.println(info);
}
// 向客户端写入信息
OutputStream os = socket.getOutputStream();
String str = "欢迎登陆到server服务器!";
os.write(str.getBytes());
// 关闭文件流
os.close();
br.close();
is.close();
socket.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Bio {
public static void main(String[] args) {
ServerSocket server = new ServerSocket(8888);
System.out.println("服务器已经启动!");
// 接收客户端发送的信息
while(true){
Socket socket = null;
try {
socket = server.accept();
} catch (IOException e) {
e.printStackTrace();
}
new Thread(() ->{
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while ((info = br.readLine()) != null) {
System.out.println(info);
}
// 向客户端写入信息
OutputStream os = socket.getOutputStream();
String str = "欢迎登陆到server服务器!";
os.write(str.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
}
public class Nio {
// 本地字符集
private static final String LocalCharSetName = "UTF-8";
// 本地服务器监听的端口
private static final int Listenning_Port = 8888;
// 缓冲区大小
private static final int Buffer_Size = 1024;
// 超时时间,单位毫秒
private static final int TimeOut = 3000;
public static void main(String[] args) throws IOException {
// 创建一个在本地端口进行监听的服务Socket信道.并设置为非阻塞方式
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.socket().bind(new InetSocketAddress(Listenning_Port));
serverChannel.configureBlocking(false);
// 创建一个选择器并将serverChannel注册到它上面
Selector selector = Selector.open();
//设置为客户端请求连接时,默认客户端已经连接上
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
// 轮询监听key,select是阻塞的,accept()也是阻塞的
if (selector.select(TimeOut) == 0) {
System.out.println(".");
continue;
}
// 有客户端请求,被轮询监听到
Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
while (keyIter.hasNext()) {
SelectionKey key = keyIter.next();
if (key.isAcceptable()) {
SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept();
clientChannel.configureBlocking(false);
//意思是在通过Selector监听Channel时对读事件感兴趣
clientChannel.register(selector, SelectionKey.OP_READ,
ByteBuffer.allocate(Buffer_Size));
}
else if (key.isReadable()) {
SocketChannel clientChannel = (SocketChannel) key.channel();
// 接下来是java缓冲区io操作,避免io堵塞
ByteBuffer buffer = (ByteBuffer) key.attachment();
buffer.clear();
long bytesRead = clientChannel.read(buffer);
if (bytesRead == -1) {
// 没有读取到内容的情况
clientChannel.close();
} else {
// 将缓冲区准备为数据传出状态
buffer.flip();
// 将获得字节字符串(使用Charset进行解码)
String receivedString = Charset
.forName(LocalCharSetName).newDecoder().decode(buffer).toString();
System.out.println("接收到信息:" + receivedString);
String sendString = "你好,客户端. 已经收到你的信息" + receivedString;
buffer = ByteBuffer.wrap(sendString.getBytes(LocalCharSetName));
clientChannel.write(buffer);
key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
}
}
keyIter.remove();
}
}
}
}
public class Netty {
public void start(int port) throws Exception
{
ServerBootstrap strap = new ServerBootstrap();
//主线程
EventLoopGroup bossGroup = new NioEventLoopGroup();
//从线程
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
strap.group(bossGroup, workerGroup).
//主线程监听通道
channel(NioServerSocketChannel.class).
option(ChannelOption.SO_BACKLOG, 1024).
//定义从线程的handler链,责任链模式
childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new NettyServerHandler());
}
});
ChannelFuture future=strap.bind(port).sync();
future.channel().closeFuture().sync();
}finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
System.out.println("start server");
new Netty().start(8000);
}
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:
https://blog.csdn.net/qq_20597727/article/details/80789272
粉丝福利:Java从入门到入土学习路线图
👇👇👇
👆长按上方微信二维码 2 秒
感谢点赞支持下哈
评论
了解加密货币到加密货币的互换
1、什么是加密货币互换?加密货币到加密货币的互换是指以现行市场汇率将一种加密货币直接兑换为另一种加密货币。与需要法定货币存款和较长流程的传统交易所不同,加密货币到加密货币的互换可以无缝地促进交换。掉期在提高加密货币的流动性和效率方面发挥着重要作用。该功能使用户能够将他们的加密货币与钱包中的其他代币进
区块链头条
0
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
零售业降本增效的新举措:从卖场的能耗入手
导语:对于超市企业来讲,通过节能灯具减少40%以上照明电费,是切实可行的节流方案之一。商超节能,势在必行!零售企业的降本增效从何入手?它们更需要怎样的创新产品与照明解决方案?广东富兴商超照明有限公司总经理唐京飘在第二十届全国连锁商业发展战略论坛上,与大家分享了“如何用科技创新推动超市节能”的主题演讲
联商网资讯
0
某程序员吐槽:公司最近招了一批35左右的,这帮人习惯天天卷到八点多,导致现在我们也要八点才下班
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁某位程序员的吐槽引发了广泛的思考和共鸣。他抱怨公司
源码共读
0
江苏省人民医院外科党总支专家团队到盱眙县人民医院开展惠民医疗活动
党建引领聚合力,共建交流惠民生。4月20日,江苏省人民医院外科党总支专家团队走进盱眙县人民医院开展党建主题活动。江苏省人民医院外科党总支书记、大外科副主任杨力,大外科主任吴延虎,盱眙县人民医院院长干文武出席座谈交流会并讲话,盱眙县人民医院党委委员、副院长刘新亮主持了活动。杨力说,江苏省人民医院和盱眙
盱眙老妹
0
SpringBoot+Minio实现上传凭证、分片上传、秒传和断点续传
关注我们,设为星标,每天7:40不见不散,架构路上与您共享回复架构师获取资源大家好,我是你们的朋友架构君,一个会写代码吟诗的架构师。Spring Boot整合Minio后,前端的文件上传有两种方式:1、文件上传到后端,由后端保存到Minio这种方式好处是完全由后端集中管理,可以很好的做到、身份验证、
Java架构师社区
0
惹到雷军,智己惨了
作为上汽集团品牌向上的“双翼战略”,智己汽车与飞凡汽车的价格接连下探,被迫与小米汽车同台竞争。可在热度与销量上,三者相形见绌。2023年,智己和飞凡销量累计约6万台;2024年3月28日,小米汽车上市27分钟大定破5万。老实巴交的车二代眼馋营销高手小米的热度,于是做了一场照猫画虎的“致敬”。不成想却
亿欧网
0
每天骑的共享单车是什么通信原理,有人了解过吗?
转自:网络我们经常骑的共享单车到底是什么通信原理,有人了解过吗?现在就带大家了解下。一、智能车锁共享单车最核心的硬件是智能车锁,主要用于实现控制和定位功能。车锁内集成了嵌入式芯片(通信模块),GPS模块和物联网SIM卡。智能锁制造商通过在锁内集成带有独立号码的SIM卡,通过2G、3G、4G网络,与云
菜鸟学Python
1