Netty的客户端建立
以前只会用js的socket来实现, 或者在命令行中, 在本例子中, 我们使用的是websocket
首先, 我们来书写一个WebSocketConfig类, 它实现了WebSocketconfigurer接口, 所以我们要重写它的registerWebSocketHandler(WebSocketHandlerRegistry registry)方法:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。1 @Override 2 public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 3 registry.addHandler(SocketHandler(), url); 4 }
url为前端的地址, 其中SocketHandler为我们自定义的webSocket处理类, 他实现了WebSocketHandler接口, 它有一下几个方法:
1 void afterConnectionEstablished(WebSocketSession var1) throws Exception; //建立连接后触发的回调 2 3 void handleMessage(WebSocketSession var1, WebSocketMessage<?> var2) throws Exception; // 收到消息时触发的回调 4 5 void handleTransportError(WebSocketSession var1, Throwable var2) throws Exception; // 传输消息出错时触发的回调 6 7 void afterConnectionClosed(WebSocketSession var1, CloseStatus var2) throws Exception; // 断开连接后触发的回调 8 9 boolean supportsPartialMessages(); //是否处理分片消息
这样, 我们webSocket吃力相关的就写完了, 接下来来写client客户端, 我们就建一个类,在里面写上start()方法:
1 public void start() throws Exception { 2 EventLoopGroup group = new NioEventLoopGroup(); 3 try { 4 Bootstrap b = new Bootstrap(); 5 // 注册线程池 6 b.group(group) 7 // 使用NioSocketChannel来作为连接用的channel类 , TCP Socket 8 .channel(NioSocketChannel.class) 9 // 绑定连接端口和host信息 10 .remoteAddress(new InetSocketAddress(this.host, this.port)) 11 // 绑定连接初始化器 12 .handler(new ChannelInitializer<SocketChannel>() { 13 // 注册通道 14 @Override 15 protected void initChannel(SocketChannel ch) throws Exception { 16 ch.pipeline().addLast(new ClientHandler()); 17 } 18 }); 19 // 异步连接服务器 20 ChannelFuture cf = b.connect().sync(); 21 // 异步等待关闭连接channel 22 cf.channel().closeFuture().sync(); 23 } finally { 24 // 释放线程池资源 25 group.shutdownGracefully().sync(); 26 } 27 }
其中, ClientHandler是客户端的业务类, 它继承自SimpleChannelInboundHandler<T>类, 它的源码如下:
1 public abstract class SimpleChannelInboundHandler<I> extends ChannelInboundHandlerAdapter { 2 private final TypeParameterMatcher matcher; 3 private final boolean autoRelease; 4 5 protected SimpleChannelInboundHandler() { 6 this(true); 7 } 8 9 protected SimpleChannelInboundHandler(boolean autoRelease) { 10 this.matcher = TypeParameterMatcher.find(this, SimpleChannelInboundHandler.class, "I"); 11 this.autoRelease = autoRelease; 12 } 13 14 protected SimpleChannelInboundHandler(Class<? extends I> inboundMessageType) { 15 this(inboundMessageType, true); 16 } 17 18 protected SimpleChannelInboundHandler(Class<? extends I> inboundMessageType, boolean autoRelease) { 19 this.matcher = TypeParameterMatcher.get(inboundMessageType); 20 this.autoRelease = autoRelease; 21 } 22 23 public boolean acceptInboundMessage(Object msg) throws Exception { 24 return this.matcher.match(msg); 25 } 26 27 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { 28 boolean release = true; 29 30 try { 31 if(this.acceptInboundMessage(msg)) { 32 this.channelRead0(ctx, msg); 33 } else { 34 release = false; 35 ctx.fireChannelRead(msg); 36 } 37 } finally { 38 if(this.autoRelease && release) { 39 ReferenceCountUtil.release(msg); 40 } 41 42 } 43 44 } 45 46 protected abstract void channelRead0(ChannelHandlerContext var1, I var2) throws Exception; 47 }
我们可以很轻易的从这些方法的名字上看出这些方法的功能, 通过重写这些方法我们就可以实现自己想要的功能
最后, 因为我们要实现的是web项目的功能, 所以不能忘记了前端的书写. 我们在js相应的方法中定义一个ws = new Websocket('ws://' + host + url), host为主机地址, url为web控制器的url, 它有一下几个常用的变量:
1 ws.open // 开启 2 ws.onmessage // 收到数据后的处理 3 ws.send // 发送的数据 4 ws.onclose // 关闭
这样, 我们一个Netty的客户端就基本完成了

更多精彩