NettyClient.java 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package com.mes.netty;
  2. import io.netty.bootstrap.Bootstrap;
  3. import io.netty.channel.*;
  4. import io.netty.channel.nio.NioEventLoopGroup;
  5. import io.netty.channel.socket.SocketChannel;
  6. import io.netty.channel.socket.nio.NioSocketChannel;
  7. import io.netty.handler.codec.string.StringEncoder;
  8. import java.util.concurrent.TimeUnit;
  9. import com.mes.ui.MesClient;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. public class NettyClient {
  13. public static final Logger log = LoggerFactory.getLogger(NettyClientHandler.class);
  14. public SocketChannel socketChannel;
  15. public static ChannelFuture future;
  16. public void run(Object msg){
  17. //配置线程组
  18. EventLoopGroup group = new NioEventLoopGroup();
  19. //创建服务启动器
  20. Bootstrap bootstrap = new Bootstrap();
  21. //配置参数
  22. bootstrap.group(group)
  23. .channel(NioSocketChannel.class)
  24. .option(ChannelOption.TCP_NODELAY,true)
  25. .handler(new ChannelInitializer<SocketChannel>() {
  26. protected void initChannel(SocketChannel socketChannel) throws Exception {
  27. socketChannel.pipeline()
  28. .addLast(new XDecoder())
  29. .addLast(new StringEncoder())
  30. // .addLast(new StringDecoder())
  31. .addLast(new NettyClientHandler());
  32. }
  33. })
  34. .remoteAddress(MesClient.mes_server_ip,MesClient.mes_tcp_port);
  35. //连接
  36. future = bootstrap.connect();
  37. log.info("客户端正在连接服务端...");
  38. //客户端断线重连逻辑
  39. future.addListener((ChannelFutureListener) future1 -> {
  40. if (future1.isSuccess()) {
  41. //tcp连接成功
  42. MesClient.tcp_connect_flag = true;
  43. //设置TCP请求状态
  44. MesClient.connect_request_flag = false;
  45. log.info("连接Netty服务端成功");
  46. future.channel().writeAndFlush(msg);
  47. } else {
  48. //tcp连接失败
  49. MesClient.tcp_connect_flag = false;
  50. MesClient.connect_request_flag = true;
  51. log.info("连接失败,进行断线重连");
  52. future1.channel().eventLoop().schedule(() -> run(msg), 10, TimeUnit.SECONDS);
  53. }
  54. //设置tcp连接状态
  55. MesClient.setTcpStatus();
  56. });
  57. socketChannel = (SocketChannel) future.channel();
  58. }
  59. }