client部分代碼:
//線程
EventLoopGroup worker = new NioEventLoopGroup();
//輔助類
Bootstrap b = new Bootstrap();
//注冊server
b.group(worker)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel sc) throws Exception {
// TODO Auto-generated method stub
sc.pipeline().addLast(new ClientHandler());
}
});
clientHandler部分代碼:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// TODO Auto-generated method stub
try {
ByteBuf buf = (ByteBuf)msg;
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
String result = new String(bytes, "utf-8");
System.out.println("Server: " + result);
}finally {
ReferenceCountUtil.release(msg);
}
}
下面查看完整代碼 :
client:
public static void main(String[] args) throws InterruptedException {
//線程
EventLoopGroup worker = new NioEventLoopGroup();
//輔助類
Bootstrap b = new Bootstrap();
//注冊server
b.group(worker)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel sc) throws Exception {
// TODO Auto-generated method stub
//不做任何處理,ByteBuf格式傳輸
sc.pipeline().addLast(new ClientHandler());
}
});
ChannelFuture cf = b.connect("127.0.0.1", 8765).sync();
cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello netty!!".getBytes()));
// Thread.sleep(1000);
// cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello netty!!".getBytes()));
// Thread.sleep(1000);
// cf.channel().writeAndFlush(Unpooled.copiedBuffer("hello netty!!".getBytes()));
//發送完畢,斷開連接
cf.addListener(ChannelFutureListener.CLOSE);
cf.channel().closeFuture().sync();
worker.shutdownGracefully();
}
clientHandler代碼:
需要繼承:ChannelHandlerAdapter這個類
public class ClientHandler extends ChannelHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// TODO Auto-generated method stub
try {
//原始ByteBuf數據格式處理
ByteBuf buf = (ByteBuf)msg;
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
String result = new String(bytes, "utf-8");
System.out.println("Server: " + result);
}finally {
//接收處理完后,丟棄
ReferenceCountUtil.release(msg);
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
// TODO Auto-generated method stub
cause.printStackTrace();
ctx.close();
}
}
Server代碼:
public static void main(String[] args) throws InterruptedException {
//第一個線程連接client端
EventLoopGroup boss = new NioEventLoopGroup();
//第二個線程處理邏輯
EventLoopGroup worker = new NioEventLoopGroup();
//輔助類,注冊 server
ServerBootstrap b = new ServerBootstrap();
b.group(boss, worker)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel sc) throws Exception {
// TODO Auto-generated method stub
sc.pipeline().addLast(new ServerHandler());
}
});
//綁定指定的端口方便監聽
ChannelFuture cf = b.bind(8765).sync();
cf.channel().closeFuture().sync();
boss.shutdownGracefully();
worker.shutdownGracefully();
}
serverHandler代碼:
需要繼承:ChannelHandlerAdapter 類
public class ServerHandler extends ChannelHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// TODO Auto-generated method stub
ByteBuf buf = (ByteBuf)msg;
byte[] bs = new byte[buf.readableBytes()];
buf.readBytes(bs);
String result = new String(bs, "utf-8");
System.out.println("Client: " + result);
String response = "888888";
ctx.writeAndFlush(Unpooled.copiedBuffer(response.getBytes()));
//.addListener(ChannelFutureListener.CLOSE);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
// TODO Auto-generated method stub
cause.printStackTrace();
ctx.close();
}
}
