以前只会用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的客户端就基本完成了

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄