1、client类 建立socket连接,发送报文请求服务端
package com.bokeyuan.client; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; 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; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import java.nio.charset.Charset; public class Client { public static void main(String[] args) { /**调用netty客户端*/ doRequest(); } private static void doRequest(){ /**处理请求和服务端响应数据的线程组*/ EventLoopGroup workerGroup = new NioEventLoopGroup(); try { /**客户端相关配置信息*/ Bootstrap bootstrap = new Bootstrap(); //绑定线程组 bootstrap.group(workerGroup); bootstrap.channel(NioSocketChannel.class); bootstrap.option(ChannelOption.SO_KEEPALIVE, true); /* * 客户端必须绑定处理器,也就是必须调用handler方法 */ bootstrap.handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ClientHandler()); } }); ChannelFuture future = bootstrap.connect("192.169.1.165", 8091).sync(); //请求报文 String msg="0010awesdfgtyh"; byte[] data = msg.getBytes("GBK"); ByteBuf byteBufMsg = Unpooled.buffer(); byteBufMsg.writeBytes(data); future.channel().writeAndFlush(byteBufMsg);
future.channel().closeFuture().sync(); } catch (InterruptedException e) { e.printStackTrace(); }finally{ workerGroup.shutdownGracefully(); } } }
2、ClientHandler类 处理服务端响应报文
继承ChannelInboundHandlerAdapter 类
package com.bokeyuan.client; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import java.io.UnsupportedEncodingException; public class ClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { try{ ByteBuf buf = (ByteBuf) msg; String rev = getMessage(buf); System.out.println("响应报文:" + rev); }catch (Exception e){ e.printStackTrace(); } } private String getMessage(ByteBuf buf) { byte[] con = new byte[buf.readableBytes()]; buf.readBytes(con); try { return new String(con, "GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } } }
其他写法
1、改成在ClientHandler类(继承了ChannelInboundHandlerAdapter)中发送请求报文
- 1、覆写父类channelActive方法,在此方法中调用ctx.writeAndFlush()发送请求报文
(客户端与服务端建立连接时会执行channelActive方法)
- 2、去掉Client类中的future.channel().wirteAndFlush()代码
2、直接传报文字符串,不将报文转为ByteBuf,即channel.writeAndFlush(报文字符串)
- 1.1、innitChannel中添加字符串解码器,字符串编码器
- 1.2、future.channel().writeAndFlush(msg)中 ,msg直接传原始报文内容,不需要转为ByteBuf
- 1.3、ClientHandler类的channelRead方法,不需要将msg由Bytebuf转为String