netty(二)——对象传递
程序员文章站
2022-07-04 21:33:20
...
上一篇中服务端把字符串转换成字符数组后传给客户端,那么能否直接传递对象呢?答案当然是可以,不过这个对象必须实现了Serializable接口(如果对象没实现Serializable接口,那么将不能传递该对象,但是程序也没有报以错,具体还得查看netty源码怎么写的)。
要传递的对象:
public class User implements Serializable { private Long id; private String username; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + '}'; } }
服务器端代码:
public class ObjectServer { public void run() throws InterruptedException { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader())),new ObjectEncoder(), new ObjectServerHandler()); } }) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); ChannelFuture f = b.bind(7777).sync(); System.out.println("server started."); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { new ObjectServer().run(); } } public class ObjectServerHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { User user = (User) msg; System.out.println(user); user.setUsername("ooxx"); ctx.write(user); ctx.flush(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { ctx.close(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { //打印异常信息并关闭连接 cause.printStackTrace(); ctx.close(); } }
客户端代码:
public class ObjectClient { public static void main(String[] args) throws InterruptedException { EventLoopGroup workerGroup = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(workerGroup) .channel(NioSocketChannel.class) .option(ChannelOption.SO_KEEPALIVE, true) .handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new ObjectDecoder(ClassResolvers.cacheDisabled(this.getClass().getClassLoader())),new ObjectEncoder(), new ObjectClientHandler()); } }); ChannelFuture f = b.connect("127.0.0.1", 7777).sync(); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); } } } public class ObjectClientHandler extends ChannelInboundHandlerAdapter { @Override public void channelActive(ChannelHandlerContext ctx) throws Exception { User user = new User(); user.setId(1L); user.setUsername("netty"); ctx.write(user); ctx.flush(); System.out.println("xxx"); } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { User user = (User) msg; System.out.println(user); ctx.close(); } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { cause.printStackTrace(); ctx.close(); } }