其实很简单,就是调用ctx的write方法,但是有一个需要注意的地方,就是write中参数虽然netty定义的是Object,但是实际上,似乎只能ByteBuf类型才可以,因为刚开始学习netty,所以具体原因不清楚为什么
本文演示之前,我个人推荐一个工具,这个工具方便学习网络相关的只是,名字叫《网络调试助手》,英文名字叫《NetAssist》,是个国产软件,直接从百度搜索即可,它的图标是这个样子的
下面是一个以NetAssist作为客户端向netty服务器发送字符串aaaa,服务器返回字符串bbbb的一个事例
一共两个类
第一个类,Handler
public class MyServerHandler1 implements ChannelInboundHandler {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf bb = (ByteBuf) msg;
int len = bb.readableBytes();
byte[] bytes = new byte[len];
bb.readBytes(bytes);
String value = new String(bytes);
//打印客户端传递过来的值
System.out.println(objName + ":channelRead,值:" + value);
//返回给客户端一个字符串bbbb
//本文唯一值得注意的就是这里,下文会阐述
ByteBuf result = Unpooled.copiedBuffer("bbbb".getBytes());
ctx.writeAndFlush(result);
}
}
注意:,如果我将代码
ByteBuf result = Unpooled.copiedBuffer("bbbb".getBytes());
ctx.writeAndFlush(result);
修改成
ctx.writeAndFlush("bbbb".getBytes())或者ctx.writeAndFlush("bbbb")
将会造成无法给客户端返回信息的情况,我也不清楚是为什么。。。。既然writeAndFlush方法接收Object类型,那么为什么必须要传递ByteBuf才可以呢?暂时未知
第二个类,启动类
public class TestServer1 {
public static void main(String[] args) throws InterruptedException {
EventLoopGroup boosGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(boosGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new MyServerHandler1());
ChannelFuture f = b.bind(9999).sync();
f.channel().closeFuture().sync();
}
}
打开NetAssist,如图
先在左上方"网络设置"如图设置好三个选项,点击连接按钮,然后在下方白色处输入aaaa,点击发送,可以看到上访白色处返回了bbbb,说明netty服务器已经开始工作
NODE:事例中我将ctx.writeAndFlush(result);方法写到了channelRead中,个人觉得写到完成事件(channelReadComplete方法)中的话代码更符合逻辑一些