首页 > 其他分享 >Netty-TCP 03.服务端

Netty-TCP 03.服务端

时间:2023-06-30 20:13:46浏览次数:33  
标签:Netty TCP public host new port 服务端

本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【3】部分,主要介绍服务端的实现。

模块划分

跟客户端类似,服务端也是主要分为三个部分:

  1. 心跳检测处理
  2. 消息消费处理
  3. TCP服务实现

心跳检测

服务端需要定时检测客户端是否在线(即是否发送心跳),如果没有,那么将客户端连接断开,同样通过注册Netty的IdleStateHandler监听IdleState事件来实现:

/**
 * @author michong
 */
public class PingHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof IdleStateEvent) {
            IdleState state = ((IdleStateEvent) evt).state();
            if (state == IdleState.READER_IDLE) {
                ctx.close();
            }
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }
}

消息消费

这个部分实现跟客户端基本是完全一致的,只不过这里额外处理了一下,在收到的数据包不是心跳包时,给客户端发送一个"OK."字符串:

/**
 * @author michong
 */
public class PacketHandler extends SimpleChannelInboundHandler<Packet> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Packet msg) {
        if (msg.getType() == Pkt.PING) {
            return;
        }
        System.out.printf("收到消息:类型=%d,内容=%s\n", msg.getType(), new String(msg.getContent()));
        ctx.channel().writeAndFlush(new Packet(Pkt.TEXT, "OK.".getBytes()));
    }
}

TCP服务

跟客户端不同的是,服务端使用的ServerBootstrap,采用NIO的方式启动TCP服务:

/**
 * @author michong
 */
public class TCPServerBootstrap {

    private final String host;
    private final int port;

    private EventLoopGroup bossGroup;
    private EventLoopGroup workGroup;

    public TCPServerBootstrap(String host, int port) {
        this.host = host;
        this.port = port;
    }

    public void start() {
        bossGroup = new NioEventLoopGroup(1);
        workGroup = new NioEventLoopGroup(256);

        ServerBootstrap bootstrap = new ServerBootstrap();
        bootstrap.group(bossGroup, workGroup).channel(NioServerSocketChannel.class);
        bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel socketChannel) {
                ChannelPipeline pipe = socketChannel.pipeline();
                pipe.addLast(
                        new IdleStateHandler(TCPConst.IDLE_TIME_OUT_MILLISECONDS * 3, 0, 0, TimeUnit.MILLISECONDS));
                pipe.addLast(new PingHandler());
                pipe.addLast(new PacketEncoder());
                pipe.addLast(new PacketDecoder());
                pipe.addLast(new PacketHandler());
            }
        });

        bootstrap.bind(host, port).addListener((ChannelFutureListener) cf -> {
            if (cf.isSuccess()) {
                System.out.printf("服务端启动成功 => host=%s, port=%d\n", host, port);
            } else {
                System.out.printf("服务端启动失败 => %s", cf.cause());
                System.exit(-1);
            }
        });
    }
}

标签:Netty,TCP,public,host,new,port,服务端
From: https://www.cnblogs.com/michong2022/p/17517721.html

相关文章

  • Netty-TCP 04.发消息
    本文是使用Netty开发一个简单的TCP通讯(聊天)应用程序的第【4】部分,主要测试客户端和服务端的通讯。服务端下面是服务端测试代码:/***@authormichong*/publicclassTCPServer{publicstaticvoidmain(String[]args){TCPServerBootstrapbootstrap=ne......
  • Netty——5、源码分析
    1、启动剖析我们来看看netty中对下面的代码是怎样处理的。publicclassTest{publicstaticvoidmain(String[]args)throwsIOException{//1netty中使用NioEventLoop(简称nioboss线程)来封装线程和selectorSelectorselector=Selector.o......
  • C# ModbusRtu或者TCP协议上位机源码,包括存储,数据到SQL SERVER数据库,趋势曲线图,数据报
    C#ModbusRtu或者TCP协议上位机源码,包括存储,数据到SQLSERVER数据库,趋势曲线图,数据报表,实时和历史报警界面,有详细注释,需要哪个协议版本原创文章,转载请说明出处,资料来源:http://imgcs.cn/5c/655313350668.html......
  • TCP协议的握手与分手
    TCP的三次握手四次分手TCP协议建立连接总共需要进行三步主机A请求主机BB确认收到请求回复AA确认收到B的回复三次握手都是进行同一个端口(随机端口)SYN:请求同步ACK:确认同步#第一次握手,从主机A的60517端口发送到远程22端口,[SYN]请求60517→22[SYN]Seq=0Win=642......
  • EPSON机械手跟相机搭配走tcp ip协议,及跟plc通讯将手动操作部分映射到触摸屏
    EPSON机械手跟相机搭配走tcpip协议,及跟plc通讯将手动操作部分映射到触摸屏EPSON机械手与相机通过TCP/IP协议进行配对,并与PLC进行通信,以将手动操作部分映射到触摸屏。这样做的好处是可以实现更高效的自动化操作和监控。在这段话中涉及到的知识点和领域范围包括:EPSON机械手:机械手是......
  • TCP三次握手/四次挥手
    三次握手第一次握手:主机A发送位码为syn=1,随机产生seqnumber=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;第二次握手:主机B收到请求后要确认联机信息,向A发送acknumber=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;第三次握手:主机A收到......
  • C#TCP通讯
    服务端代码TcpListenertcpListener=newTcpListener(IPAddress.Parse("192.168.1.1"),9000);tcpListener.Start();//启动服务While(true){TcpClienttcpClient=tcpListener.AcceptTCPClient();//收到链接NetWorkStreamsteam=tcpClient.GetStream();byte[]receiveData=n......
  • ETH-TCP协议与常见问题分析
    SourcePort:源端口,标识发送方的应用进程DestinationPort:目的端口,标识接收方的应用进程SequenceNumber:序列号,用于标识从发送端发出的不同的TCP数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化;接收端依据此序列号,便可按照正确的顺序重组数据。保证数据传输的有序性......
  • Netty
    Netty是一个高性能、异步事件驱动的NIO框架,基于JavaNIO提供的API实现。它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获取IO操作结果。Netty高性能在IO编程过程中,当需......
  • Kong入门学习实践(6)HTTPS与TCP流代理
    最近在学习Kong网关,因此根据老习惯,我会将我的学习过程记录下来,一来体系化整理,二来作为笔记供将来翻看。由于我司会直接使用Kong企业版,学习过程中我会使用Kong开源版。本篇,我们学习快速配置HTTPS跳转与TCP流代理。HTTPS跳转配置HTTP协议虽然应用广泛,简单易用,但存在着巨大的安......