SpringBoot 集成 Netty 写的 TCP 服务器遇到的问题

问题是这样子的,我使用 SpringBoot 写了个服务,然后启动了 https,端口监听的是 8080,然后我用 Netty 写了个 TCP 服务器,端口监听 9000,然后集成到 SpringBoot 中,所以打包成 jar 包之后启动会启动两个服务,一个 8080 的 http 服务,一个 9000 的 Netty tcp 服务。

在本地通过以下代码可以进行客户端连接到服务器

public final class EchoClient {
  static final String HOST = System.getProperty("host", "localhost");
  static final int PORT = Integer.parseInt(System.getProperty("port", "9000"));
  static final int SIZE = Integer.parseInt(System.getProperty("size", "256"));

  public static void main(String[] args) throws Exception {
    EventLoopGroup group = new NioEventLoopGroup();
    try {
      Bootstrap b = new Bootstrap();
      b.group(group)
              .channel(NioSocketChannel.class)
              .remoteAddress(new InetSocketAddress(HOST, PORT))
              .option(ChannelOption.TCP_NODELAY, true)
              .handler(new ChannelInitializer<SocketChannel>() {
                @Override
                public void initChannel(SocketChannel ch) throws Exception {
                  ChannelPipeline p = ch.pipeline();
                  //p.addLast(new LoggingHandler(LogLevel.INFO));
                  p.addLast(new EchoClientHandler());
                }
              });
      ChannelFuture channelFuture = b.connect().sync();
      channelFuture.channel().closeFuture().sync();
    } finally {
      // Shut down the event loop to terminate all threads.
      group.shutdownGracefully();
    }
  }
}
public class EchoClientHandler extends ChannelInboundHandlerAdapter {
  private static final Logger log = Logger.getLogger(EchoClientHandler.class.getName());

  private final ByteBuf firstMessage;

  /**
   * Creates a client-side handler.
   */
  public EchoClientHandler() {
    firstMessage = Unpooled.buffer(EchoClient.SIZE);
    firstMessage.writeBytes("YXV0aEluZm9AYWE6MTIxMTIxMjEy".getBytes(StandardCharsets.UTF_8));
  }

  @Override
  public void channelActive(ChannelHandlerContext ctx) throws Exception {
    log.log(Level.INFO, "正在连接服务端");
    if (ctx.channel().isOpen()) {
      log.info("已开辟连接链路");
      log.info("正在发送消息");
      ChannelFuture channelFuture = ctx.writeAndFlush(firstMessage);
      if (channelFuture.isDone()) {
        log.info("消息发送完毕");
      }
    }
    super.channelActive(ctx);
  }

  @Override
  public void channelReadComplete(ChannelHandlerContext ctx) {
    ctx.flush();
  }

  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
    // Close the connection when an exception is raised.
    cause.printStackTrace();
    ctx.close();
  }
}

但是我把 localhost 修改成阿里云服务器的 ip 地址就不行

Exception in thread "main" io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /ip地址:9000
Caused by: java.net.ConnectException: Connection refused: no further information
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:714)
at io.netty.channel.socket.nio.NioSocketChannel.doFinishConnect(NioSocketChannel.java:330)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:702)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)

目前知道的信息是:

  1. 使用 Windows Server 2008 RC2
  2. 已经关闭了防火墙
  3. 已经在阿里云配置了安全组规则,入站出站规则都配置了
  4. SpringBoot 服务肯定是已经启动了的,在服务器上使用客户端连接没有问题
  5. SpringBoot 启用了 https,tcp 没有
  6. 通过 telnet ip 9000 不通

不知道是什么原因,还请各位帮忙。

  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    44 引用 • 32 回帖 • 2 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    792 引用 • 1375 回帖 • 688 关注
  • TCP
    26 引用 • 37 回帖 • 2 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    1762 引用 • 11541 回帖 • 581 关注

赞助商 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Gouzhong1223

    把 IP 改成机器的内网 IP 试试呢?

    1 回复
  • DASHU

    把 host 改成 0.0.0.0 试试

    1 回复
  • Ever

    我是在想本地连接线上的 tcp 服务,修改成 0.0.0.0 应该不行吧,主要问题就是配置了入站出站规则,但是仍然是不能通过外网访问这个 9000 这个端口

  • Ever

    改成内网 ip 的话,外网应该就不能访问了吧。我部署到生产环境的,还是需要能外网访问才能管理设备

    1 回复
  • 233333

    trollface

    1. 本地安全组放开,
    2. 阿里云的也要放
    3. 用这个端口起个别的服务测测能不能打开,
    4. 联系客服
  • Gouzhong1223

    我遇到这种问题的话,就用 Nginx 代理了,公网环境通过域名,然后 Nginx 代理到我们的内网端口

  • Gakkiyomi2019

    除了服务器上的防火墙 还要关本地的防火墙

请输入回帖内容 ...