一起学netty(5)netty入门程序案例
服务端
package com.weblog.netty.basic.server;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
public class NettyServer {
public static void main(String[] args) throws Exception{
//创建两个线程组bossGroup和workGroup,含有的子线程NioEventLoop的个数默认为cpu核心数的两倍。
//bossGroup只处理连接请求,workGroup处理客户端消息收发的业务。
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workGroup = new NioEventLoopGroup(8);
//服务端对象
ServerBootstrap serverBootstrap = new ServerBootstrap();
//绑定线程组
serverBootstrap.group(bossGroup,workGroup)
//使用NioServerSocketChannel作为服务器的通道实现
.channel(NioServerSocketChannel.class)
//初始化服务器的连接队列大小,服务端处理客户端连接请求是顺序处理的,所以同一时刻只能处理一个客户端连接
//多个客户端同时来的时候,服务端将不能同时处理的客户端连接请求放在等待队列中等待处理。
.option(ChannelOption.SO_BACKLOG,1024)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
//解码器,把消息转成字符串
pipeline.addLast(new StringDecoder());
//编码器,把消息转成字符串
pipeline.addLast(new StringEncoder());
//客户端消息处理类
pipeline.addLast(new NettyServerHandler());
}
});
//绑定端口
ChannelFuture channelFuture = serverBootstrap.bind(8077).sync();
channelFuture.channel().closeFuture().sync();
}
}
服务端消息处理类
package com.weblog.netty.basic.server;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
/**
* @author: Jiajiajia
* @Date: 2021/8/7
* @Description: netty服务器端处理类
*/
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
/**
* 当客户端连接服务器时,会触发改方法
* @param ctx
* @throws Exception
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
System.out.println("有客户端连接成功");
}
/**
* 当客户端有数据发送到服务器时会触发该方法
* @param ctx
* @param msg
* @throws Exception
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("读取客户端发送的数据:"+msg);
ctx.writeAndFlush("hi");
}
/**
* 客户端断开连接的时候会触发该方法
* @param ctx
* @throws Exception
*/
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
System.out.println("客户端断开连接");
}
/**
* 客户端连接发生异常的时候会触发该方法
* @param ctx
* @param cause
* @throws Exception
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.out.println("客户端连接发生异常,断开连接");
ctx.close();
}
}
一般只用java写netty的服务器端程序,连接测试,收发消息测试可以用telnet命令测试。
客户端
package com.weblog.netty.basic.click;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
public class NettyClient {
public static void main(String[] args) throws Exception{
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(new NioEventLoopGroup())
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast(new StringDecoder());
pipeline.addLast(new StringEncoder());
pipeline.addLast(new NettyClientHandler());
}
});
//服务器ip端口
ChannelFuture sync = bootstrap.connect("127.0.0.1", 8077).sync();
Channel channel = sync.channel();
//发送消息
channel.writeAndFlush("hello");
}
}
客户端处理类
package com.weblog.netty.basic.click;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class NettyClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("读取服务器信息:"+msg);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
System.out.println("连接断开");
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.out.println("连接异常");
}
}
猜你喜欢
official
1285
在上一节《一起学netty(6)》的文章中,简要说明了用nio原生代码写程序的一些不足和问题,以及netty在nio的基础上大致做了那些工作。其中提到一点就是当活跃客户端的数量太多,单线程处理时所带
official
1193
代码已上传github,地址:https://github.com/18438301593/rabbitmq
official
1453
之前的文章中提到过,单线程的nio模型任然有一定缺点。在上一节《一起学netty(7)netty的线程模型》中也提到,netty的出现,封装了nio复杂的代码,并且介入多线程来处理事件,最大限度的提
official
1932
上一篇《一起学netty(2)nio模型及多路复用器》中已经简单介绍了nio模型,以及多路复用器的概念,并了解nio是非阻塞的网络模型,以及与bio的区别。本篇将继续深入理解nio,以及select
其他
4845
查询每门课程成绩都大于80分学生的学号数据库表studentnamescorecourseA85语文A75数学A82英语B75语文B89数学B79英语C90语文C100数学C100英语请写出每门课程
blog
枚举算法案例--熄灯问题
数据结构与算法
6803
矩阵中的每一盏灯设置一个初始状态。请你写一个程序,确定需要按下那些按钮,插好使得所有的灯都被熄灭。例图1:例图2:叉号代表按下的按钮输入:第一行是一个正整数n表示需要解决的案例数。每一个案例由5行组成,
official
1158
UpdaterequestHTTP包建立起连接,之后的通信全部使用websocket自己的协议,就和http没啥关系了。有兴趣的同学可以多了解一下websocket协议报文的详细信息。Netty实现websoc
official
1202
统级别的底层协议(传输层)。很多的应用层的协议都是基于tcp协议或udp协议来实现的,比如FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。