Netty

Stella981
• 阅读 675

最近在学习netty练习下,先附上写的代码吧

注意不要使用5.0的版本了,官方直接废弃了,可以自己搜索下。因此只用4版本的。

<dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.50.Final</version> </dependency>

服务端的代码实现:

private static int port = 8080;

public static void main(String[] args) { _// boss__线程池负责接受请求 _ NioEventLoopGroup bossGroup = new NioEventLoopGroup(); _// work__线程池负责处理请求 _ NioEventLoopGroup workGroup = new NioEventLoopGroup(); // _创建__ServerBootstrap _ ServerBootstrap serverBootstrap = new ServerBootstrap(); _// NioServerSocketChannel__标记当前是服务器 _ serverBootstrap.group(bossGroup, workGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel socketChannel) throws Exception { // _处理每个请求__hanlder _ socketChannel.pipeline().addLast(new ServerHandler()); } }); // _绑定我们的端口号码 _ try { // _绑定端口号,同步等待成功 _ ChannelFuture future = serverBootstrap.bind(port).sync(); System.out.println("服务器启动成功:" + port); // _等待服务器监听端口 _ future.channel().closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); } finally { // _优雅的关闭连接 _ bossGroup.shutdownGracefully(); workGroup.shutdownGracefully(); } }

ServerHandler类的实现

public class ServerHandler extends SimpleChannelInboundHandler { protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object o) throws Exception { // 接受我们的数据 _ ByteBuf byteBuf = (ByteBuf) o; String request = byteBuf.toString(CharsetUtil.UTF_8); System.out.println("接受到的客户端消息:" + request); // 响应内容: _ channelHandlerContext.writeAndFlush(Unpooled.copiedBuffer("这是服务端响应的消息", CharsetUtil.UTF_8)); } }

接下来开始写客户端的实现代码:

public static void main(String[] args) { _//__创建__nioEventLoopGroup _ NioEventLoopGroup group = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap(); bootstrap.group(group).channel(NioSocketChannel.class).remoteAddress(new InetSocketAddress("127.0.0.1", 8080)).handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ClientHandler()); } }); try { // _发起同步连接 _ ChannelFuture sync = bootstrap.connect().sync(); sync.channel().closeFuture().sync(); } catch (Exception e) { e.printStackTrace(); } finally { group.shutdownGracefully(); } }

ClientHandler类的实现

public class ClientHandler extends SimpleChannelInboundHandler<ByteBuf> { // _活跃通道可以发送消息 _ @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { // _发送数据 _ ctx.writeAndFlush(Unpooled.copiedBuffer("活跃通道发生消息?", CharsetUtil.UTF_8)); } protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception { System.out.println("接收服务端响应的信息:" + byteBuf.toString(CharsetUtil.UTF_8)); } }

然后就可以运行起来看效果了。

粘包和拆包的问题可以通过利用编码器LineBaseDFrameDecoder解决。在服务端的和客户端分别添加如下代码。

// 设置我们分割最大长度为__1024 socketChannel.pipeline().addLast(new LineBasedFrameDecoder(1024)); // 获取数据的结果为__string__类型 socketChannel.pipeline().addLast(new StringEncoder());

同时发送的消息加上一个\n字符进行区分。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
springboot整合netty实现TCP服务端
1、导入依赖_<!https://mvnrepository.com/artifact/io.netty/nettyall_<dependency\<groupId\io.netty</groupId\<artifactId\nettyall</artifact
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这