一、服务器,客户端搭建
1.1用到的类
TestServer中声明
EventLoopGroup boss = new NioEventLoopGroup() 线程组: 作用1、服务器接收客户端连接2、SocketChannel的网络读写
第一个经常被叫做‘boss’,用来接收进来的连接。第二个经常被叫做‘worker’,用来处理已经被接收的连接,一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上
ServerBootStrap,Bootstrap 启动NIO服务端/客户端,添加handler,group,option等参数
NioServerSocketChannel
NioSocketChannel childOption不需要
channelOption
backlog 参数指定了访问队列数量的大小
tcpNoDelay 使用于小数据即时传输,于TCP_NODELAY相对应的是TCP_CORK;
该选项是需要等到发送的数据量最大的时候,一次性发送
keepAlive 当设置该选项以后,如果在两小时内没有数据的通信时,TCP会自动发送一个活动探测数据报文
TestServerHandler中声明
ChannelInboundHandler 提供了许多事件处理的接口方法,我们可以继承重写
常用函数:
channelread 和 channelActive 的区别
在channelActive中,管道(管道里接handler来处理事情),//连接被建立并且准备进行通信时被调用
在channelRead中,管道在读取ByteBuffer的数据时,可以采取以下处理
channelRead(ChannelHandlerContext ctx, Object msg)
ByteBuf in = (ByteBuf) msg; //读取从客户端发来的消息
if(in.isreadable())
ChannelHandlerContext
ctx.write(msg) //逐字地把接受到的消息写入
ctx.flush() //把缓冲区中数据强行输出
ChannelHandlerContext.write() (和 writeAndFlush() )方法会返回一个 ChannelFuture 对象,一个 ChannelFuture 代表了一个还没有发生的 I/O 操作。这意味着任何一个请求操作都不会马上被执行,
1.2遇到的问题和思考
客户端和服务器如何相互传输??
答:首先我们搭建好服务器和客户端,并设置好handler的种类和个数socketChannel.pipeline().addLast(new TestClientHandler()),然后在handler里重写管道的相关方法ChannelActive,ChannelRead()等
测试:我们可以利用telnet访问我们设置好的服务器地址,然后输入若干信息,我们可以在控制台看到一样的信息输出,这是由于服务器的处理类中channelRead()实现了相应的操作。 如果是在客户端实现的channelRead,那么system.out.print()函数里的打印内容在ctx.close()关闭之后会发送给服务器,由服务器进行读取