client部分代码:

//线程
EventLoopGroup worker = new NioEventLoopGroup();
//辅助类
Bootstrap b = new Bootstrap();
//注册server
b.group(worker)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() { @Override
protected void initChannel(SocketChannel sc) throws Exception {
// TODO Auto-generated method stub
sc.pipeline().addLast(new ClientHandler());
}
});

  

clientHandler部分代码:

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// TODO Auto-generated method stub
try {
ByteBuf buf = (ByteBuf)msg;
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
String result = new String(bytes, "utf-8");
System.out.println("Server: " + result);
}finally {
ReferenceCountUtil.release(msg);
} }

  

下面查看完整代码 :

client:

public static void main(String[] args) throws InterruptedException {

		//线程
EventLoopGroup worker = new NioEventLoopGroup();
//辅助类
Bootstrap b = new Bootstrap();
//注册server
b.group(worker)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() { @Override
protected void initChannel(SocketChannel sc) throws Exception {
// TODO Auto-generated method stub
//不做任何处理,ByteBuf格式传输
sc.pipeline().addLast(new ClientHandler());
}
}); ChannelFuture cf = b.connect("127.0.0.1", 8765).sync(); cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello netty!!".getBytes()));
// Thread.sleep(1000);
// cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello netty!!".getBytes()));
// Thread.sleep(1000);
// cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello netty!!".getBytes()));
//发送完毕,断开连接
cf.addListener(ChannelFutureListener.CLOSE); cf.channel().closeFuture().sync();
worker.shutdownGracefully(); }

  

clientHandler代码:

需要继承:ChannelHandlerAdapter这个类

public class ClientHandler extends ChannelHandlerAdapter {

	@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// TODO Auto-generated method stub
try { //原始ByteBuf数据格式处理
ByteBuf buf = (ByteBuf)msg;
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
String result = new String(bytes, "utf-8");
System.out.println("Server: " + result);
}finally { //接收处理完后,丢弃
ReferenceCountUtil.release(msg);
} } @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
// TODO Auto-generated method stub
cause.printStackTrace();
ctx.close();
} }

  

Server代码:

public static void main(String[] args) throws InterruptedException {

		//第一个线程连接client端
EventLoopGroup boss = new NioEventLoopGroup();
//第二个线程处理逻辑
EventLoopGroup worker = new NioEventLoopGroup();
//辅助类,注册 server
ServerBootstrap b = new ServerBootstrap();
b.group(boss, worker)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() { @Override
protected void initChannel(SocketChannel sc) throws Exception {
// TODO Auto-generated method stub
sc.pipeline().addLast(new ServerHandler());
}
}); //绑定指定的端口方便监听
ChannelFuture cf = b.bind(8765).sync();
cf.channel().closeFuture().sync(); boss.shutdownGracefully();
worker.shutdownGracefully(); }

  

serverHandler代码:

需要继承:ChannelHandlerAdapter 类

public class ServerHandler extends ChannelHandlerAdapter {

	@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// TODO Auto-generated method stub
ByteBuf buf = (ByteBuf)msg;
byte[] bs = new byte[buf.readableBytes()];
buf.readBytes(bs);
String result = new String(bs, "utf-8");
System.out.println("Client: " + result); String response = "888888";
ctx.writeAndFlush(Unpooled.copiedBuffer(response.getBytes()));
//.addListener(ChannelFutureListener.CLOSE); } @Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
// TODO Auto-generated method stub
cause.printStackTrace();
ctx.close();
} }

  

netty: 以默认的ByteBuf作为传输数据的更多相关文章

  1. Netty 系列三(ByteBuf).

    一.概述和原理 网络数据传输的基本单位总是字节,Netty 提供了 ByteBuf 作为它的字节容器,既解决了 JDK API 的局限性,又为网络应用程序提供了更好的 API,ByteBuf 的优点: ...

  2. Netty实战五之ByteBuf

    网络数据的基本单位总是字节,Java NIO 提供了ByteBuffer作为它的字节容器,但是其过于复杂且繁琐. Netty的ByteBuffer替代品是ByteBuf,一个强大的实现,即解决了JDK ...

  3. 【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析

    零拷贝Zero-Copy 我们先来看下它的定义: "Zero-copy" describes computer operations in which the CPU does n ...

  4. Netty(7)源码-ByteBuf

    一.ByteBuf工作原理 1. ByteBuf是ByteBuffer的升级版: jdk中常用的是ByteBuffer,从功能角度上,ByteBuffer可以完全满足需要,但是有以下缺点: ByteB ...

  5. netty系列之:EventLoop,EventLoopGroup和netty的默认实现

    目录 简介 EventLoopGroup和EventLoop EventLoopGroup在netty中的默认实现 EventLoop在netty中的默认实现 总结 简介 在netty中不管是服务器端 ...

  6. Netty 核心容器之ByteBuf 结构详解

    原文链接 Netty 核心容器之ByteBuf 结构详解 代码仓库地址 Java的NIO模块提供了ByteBuffer作为其字节存储容器,但是这个类的使用过于复杂,因此Netty实现了ByteBuf来 ...

  7. netty系列之:netty中的ByteBuf详解

    目录 简介 ByteBuf详解 创建一个Buff 随机访问Buff 序列读写 搜索 其他衍生buffer方法 和现有JDK类型的转换 总结 简介 netty中用于进行信息承载和交流的类叫做ByteBu ...

  8. netty中的ByteBuf

    网络数据的基本单位总是字节.Java NIO 提供了 ByteBuffer 作为它 的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐. Netty 的 ByteBuffer 替代品是 ByteB ...

  9. Netty学习篇⑥--ByteBuf源码分析

    什么是ByteBuf? ByteBuf在Netty中充当着非常重要的角色:它是在数据传输中负责装载字节数据的一个容器;其内部结构和数组类似,初始化默认长度为256,默认最大长度为Integer.MAX ...

随机推荐

  1. Docker创建镜像 并推拉Harbor

    创建镜像 一.根据dockerfile创建镜像 文件详解 1.mkdir dockerfile/lib/centos7base/ 创建目录 2.创建Dockerfile vim Dockerfile ...

  2. LeetCode | 152. 乘积最大子序列

    原题(Medium): 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 思路: 遍历数组时且逐元素相乘时,如果遇到了0,在求乘积最大值的情况下,0左边的元素 ...

  3. Qt 5.12 LTS 部署

    1. 拷贝release生成的exe到一个独立的目录deploy 2. windeployqt.exe A_Toolkit.exe 3. 将qt\qt5.12.5\tool\mingw730_64\b ...

  4. Python简介及开发环境搭建

    Python简介 Python是一门动态解释性的强类型定义的计算机程序设计语言,是一种完全面向对象的语言,由荷兰人"龟叔"-Guido van Rossum于1989年开发,于19 ...

  5. 【Linux】一步一步学Linux——Centos7.5安装图解(08)

    00. 目录 参考博客:https://mp.csdn.net/mdeditor/95031775# 01. Centos7.5简介 CentOS(Community Enterprise Opera ...

  6. 最简单 无返回值 无参数 sql server存储过程

    CREATE proc Upadte_stateas update Table_1 set [state]=2 where id in (select id from Table_1 where st ...

  7. .NET Core 中三种模式依赖注入的生命周期。

    注入模式 同一个请求作用域 不同的请求作用域 AddSingleton 同一个实例 同一个实例 AddScoped 同一个实例 新实例 AddTransient 新实例 新实例

  8. 前端开发 Angular

    https://www.angularjs.net.cn/tutorial/18.html

  9. VS2017 配置 boost_1_70

    1. 下载与安装 1.1 安装方法1 (1) 下载 https://www.boost.org/ 或者使用 https://sourceforge.net/projects/boost/files/b ...

  10. MongoDB 4.2.1 安装失败,提示 verify that you have sufficient privileges to start system services 解决

    官网下载地址:https://www.mongodb.com/download-center/community 问题: 解决:直接安装在根目录 测试: