上文《Netty入门系列(一)简单编写netty服务端》我们已经实现了服务端的代码。这里我们再编写一个客户端的代码。
整个客户端的模式和服务端的模式是差不多的,主要步骤如下:
1、创建事件处理线程组 2、配置Bootstrap线程组启动netty客户端 3、添加客户端的处理handler
下面我们来演示下具体代码:
1)创建netty客户端
package com.netty.client;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import lombok.extern.slf4j.Slf4j;
/**
* 客户端
*/
@Slf4j
public class NettyClient {
// 服务器IP
private String host;
// 服务器端口
private int port;
public NettyClient(String host, int port) {
this.host = host;
this.port = port;
}
/**
* 启动 Netty 客户端
*/
public void run() throws InterruptedException {
// 创建事件循环组
NioEventLoopGroup group = new NioEventLoopGroup();
try {
// 创建 Bootstrap 对象
Bootstrap bootstrap = new Bootstrap();
// 配置Bootstrap线程组
bootstrap.group(group)
// 设置客户端通信的通道类型为NIO类型
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
// 添加消息处理器
ch.pipeline().addLast(new NettyClientHandler());
}
});
// 连接服务器,等待连接成功
ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
log.info("客户端启动完成");
channelFuture.channel().closeFuture().sync();
} finally {
//释放资源
group.shutdownGracefully();
}
}
}2)创建netty客户端的处理消息handler
package com.netty.client;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import lombok.extern.slf4j.Slf4j;
/**
* 客户端用于处理与服务器交互的handler
*/
@Slf4j
public class NettyClientHandler extends ChannelInboundHandlerAdapter {
/**
* 连接上就触发这个方法
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
String message="你好,我是客户端";
ByteBuf hello = Unpooled.copiedBuffer(message, CharsetUtil.UTF_8);
// 发送消息
ctx.writeAndFlush(hello);
}
/**
* 与服务端进行数据交互
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf buf = (ByteBuf) msg;
log.info("服务端发来的消息:"+buf.toString(CharsetUtil.UTF_8));
}
/**
* 发生异常
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
log.error(cause.getMessage(),cause);
//出现异常关闭连接
ctx.close();
}
}3)创建启动client类
package com.netty.client;
import lombok.extern.slf4j.Slf4j;
/**
* NettyClientApplication netty客户端的启动类
*
*/
@Slf4j
public class NettyClientApplication
{
public static void main( String[] args ) throws Exception {
// 创建客户端对象,并连接到服务器
NettyClient client = new NettyClient("192.168.31.115", 8888);
// 启动客户端
client.run();
}
}最后我们把项目启动起来:
可以看到客户端连接上了服务端,并且收到了服务端的信息。然后我们看看服务端的日志:
服务端也正常的收到了客户端的消息。说明我们成功的实现了客户端与服务端的打通。
最后按照惯例,附上本案例的源码,登陆后即可下载。











还没有评论,来说两句吧...