代码如下
server
package http;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public class Server {
public static void main(String[] args) throws Exception{
NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);
NioEventLoopGroup wordGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup, wordGroup).channel(NioServerSocketChannel.class).childHandler(new Initializer());
ChannelFuture channelFuture = serverBootstrap.bind(6767).sync();
channelFuture.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
wordGroup.shutdownGracefully();
}
}
}
我们在Handler 需要用到的对象 此对象封装了需要初始化的条件
package http;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;
public class Initializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();//得到管道
//加入一个http的编解码器
pipeline.addLast("encode", new HttpServerCodec());
pipeline.addLast("response", new Hand());
}
}
handler对象
package http;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.*;
import io.netty.util.CharsetUtil;
public class Hand extends SimpleChannelInboundHandler<HttpObject> {
//HttpObject这个对象是用来封装浏览器和服务器之间的通讯信息的
@Override
protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
//当有客户端的请求发过来的时候。我们就读 SimpleChannelInboundHandler 这个类其实就是我们之前用的ChannelInboundHandler的一个子类。
if (msg instanceof HttpRequest) {
System.out.println("msg.getClass() = " + msg.getClass());
System.out.println("客户端地址: " + ctx.channel().remoteAddress());
ByteBuf byteBuf = Unpooled.copiedBuffer("我是服务器:哈哈哈", CharsetUtil.UTF_8);
//构造一个HttpResponse
DefaultFullHttpResponse defaultFullHttpResponse = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, byteBuf);
defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain");
defaultFullHttpResponse.headers().set(HttpHeaderNames.CONTENT_LENGTH, byteBuf.readableBytes());
ctx.writeAndFlush(defaultFullHttpResponse);
}
}
}
浏览器请求后的数据
我是服务器:哈哈哈
要用对应的解码:UTF-8