您的位置:首页 > 其它

netty权威指南 ---------第三章 入门应用

2014-09-21 09:50 246 查看
要实现的功能: client端发送请求,server端接受请求,返回当前时间,client端将当前时间打印出来。

A :server端服务器

package com.xiaobing.netty.third;

import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioServerSocketChannel;

public class TimeServer {

public void bind(int port) throws Exception{

//服务端接受客户端的连接线程

EventLoopGroup bossGroup = new NioEventLoopGroup();

//网络读写线程

EventLoopGroup workerGroup = new NioEventLoopGroup();

//服务端辅助启动类

ServerBootstrap b = new ServerBootstrap();

try {

b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class)

.option(ChannelOption.SO_BACKLOG, 1024)

.childHandler(new ChildChannelHandler());

//阻塞等待端口绑定完成

ChannelFuture f = b.bind(port).sync();

//等待服务端链路关闭

f.channel().closeFuture().sync();

}finally{

bossGroup.shutdownGracefully();

workerGroup.shutdownGracefully();

}

}

//网络IO处理类

private class ChildChannelHandler extends ChannelInitializer<SocketChannel>{

@Override

protected void initChannel(SocketChannel arg0) throws Exception {

arg0.pipeline().addLast(new TimeServerHandler());

}

}

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

int port = 8080;

new TimeServer().bind(port);

}

}

B:server端 处理类

package com.xiaobing.netty.third;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

//对网络事件进行读写

public class TimeServerHandler extends ChannelHandlerAdapter {

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{

ByteBuf buf = (ByteBuf) msg;

//获取缓冲区可读字节数

byte[] req = new byte[buf.readableBytes()];

buf.readBytes(req);

String body = new String(req,"UTF-8");

System.out.println("The time server receive order:" + body);

String currentTimeString = "QUERY TIME ORDER".equalsIgnoreCase(body)?new java.util.Date(System.currentTimeMillis()).toString() :"BAD ORDER";

//应答消息

ByteBuf resp = Unpooled.copiedBuffer(currentTimeString.getBytes());

ctx.write(resp);

}

@Override

public void channelReadComplete(ChannelHandlerContext ctx){

//将消息发送队列的消息写入socketchannel中

ctx.flush();

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause){

//发生异常时,关闭ctx

ctx.close();

}

}

C:客户端 请求

package com.xiaobing.netty.third;

import java.security.acl.Group;

import io.netty.bootstrap.Bootstrap;

import io.netty.channel.ChannelFuture;

import io.netty.channel.ChannelInitializer;

import io.netty.channel.ChannelOption;

import io.netty.channel.EventLoopGroup;

import io.netty.channel.nio.NioEventLoopGroup;

import io.netty.channel.socket.SocketChannel;

import io.netty.channel.socket.nio.NioSocketChannel;

public class TimeClient {

public void connect(int port , String host) throws Exception{

EventLoopGroup group = new NioEventLoopGroup();

try{

//客户端启动辅助类

Bootstrap b = new Bootstrap();

b.group(group).channel(NioSocketChannel.class)

.option(ChannelOption.TCP_NODELAY, true)

.handler(new ChannelInitializer<SocketChannel>() {

//在初始化时将channelHandler 设置到channelpipeline中

@Override

protected void initChannel(SocketChannel ch) throws Exception {

ch.pipeline().addLast(new TimeClientHandler());

}

});

//发起异步连接

ChannelFuture f = b.connect(host,port).sync();

//等待客户端链路关闭

f.channel().closeFuture().sync();

}finally{

group.shutdownGracefully();

}

}

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

int port = 8080;

new TimeClient().connect(port, "127.0.0.1");

}

}

D 客户端对server端返回值的处理

package com.xiaobing.netty.third;

import io.netty.buffer.ByteBuf;

import io.netty.buffer.Unpooled;

import io.netty.channel.ChannelHandlerAdapter;

import io.netty.channel.ChannelHandlerContext;

//对网络事件进行读写

public class TimeServerHandler extends ChannelHandlerAdapter {

@Override

public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception{

ByteBuf buf = (ByteBuf) msg;

//获取缓冲区可读字节数

byte[] req = new byte[buf.readableBytes()];

buf.readBytes(req);

String body = new String(req,"UTF-8");

System.out.println("The time server receive order:" + body);

String currentTimeString = "QUERY TIME ORDER".equalsIgnoreCase(body)?new java.util.Date(System.currentTimeMillis()).toString() :"BAD ORDER";

//应答消息

ByteBuf resp = Unpooled.copiedBuffer(currentTimeString.getBytes());

ctx.write(resp);

}

@Override

public void channelReadComplete(ChannelHandlerContext ctx){

//将消息发送队列的消息写入socketchannel中

ctx.flush();

}

@Override

public void exceptionCaught(ChannelHandlerContext ctx,Throwable cause){

//发生异常时,关闭ctx

ctx.close();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: