Netty-4-服务端接受客户端传递过来的信息并返回给客户端指定的信息

其实很简单,就是调用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方法)中的话代码更符合逻辑一些

发布了157 篇原创文章 · 获赞 26 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/u011624903/article/details/50456965
今日推荐