首页 > 其他分享 >【Netty】使用Netty搭建简易Sokect客户端

【Netty】使用Netty搭建简易Sokect客户端

时间:2023-11-02 10:44:06浏览次数:28  
标签:Netty private char static Sokect new message 服务端 客户端

直接上代码

创建客户端,连接到服务端,并发送消息:

  
/** 发送一条消息到socket服务端*/
private void sendOne(String rawMessage) {
        NioEventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap bootstrap = new Bootstrap();
            bootstrap
                    .group(group)
                    .channel(NioSocketChannel.class)
                    .handler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        protected void initChannel(SocketChannel ch) {
                            ch.pipeline()
                                    .addLast(new MyDecoder())
                                    .addLast(new MyEncoder())
                                    .addLast(new MyClientHandler());
                        }
                    });
            ChannelFuture future = bootstrap.connect("192.168.1.101", 4000).sync();
            //发送消息
            future.channel().writeAndFlush(rawMessage);
            future.channel().closeFuture().sync();
        } catch (Exception e) {
            log.error("发送消息异常", e);
        } finally {
            group.shutdownGracefully();
        }
    }
//解码  服务端返回信息解码工具
public class MyDecoder extends DelimiterBasedFrameDecoder {
    private static final int MAX_FRAME_LENGTH = 4096;
    
    //和服务端约定的起始字符和中止字符
    private static char startByte = (char)11;
    private static char endByte1 = (char)28;
    private static char endByte2 = (char)13;
    
    public MyDecoder() {
        super(MAX_FRAME_LENGTH, true, Unpooled.copiedBuffer(
                new char[]{endByte1, endByte2}, StandardCharsets.UTF_8));
    }
    
    @Override
    protected Object decode(ChannelHandlerContext ctx, ByteBuf buffer) throws Exception {
        ByteBuf buf = (ByteBuf) super.decode(ctx, buffer);
        if (buf != null) {
            try {
                int pos = buf.bytesBefore((byte) startByte);
                if (pos >= 0) {
                    ByteBuf msg = buf.readerIndex(pos + 1).slice();
                    return asString(msg);
                } else {
                    throw new DecoderException("找不到开始符号:" + Integer.toHexString(startByte));
                }
            } finally {
                buf.release();
            }
        }
        return null;
    }
    
    private String asString(ByteBuf msg) {
        String text = msg.toString(StandardCharsets.UTF_8);
        return text;
    }
}

  

//编码 对发送的消息进行编码
public class MyEncoder extends MessageToByteEncoder<Object> {
    private static char startByte = (char)11;
    private static char endByte1 = (char)28;
    private static char endByte2 = (char)13;
    
    @Override
    protected void encode(ChannelHandlerContext channelHandlerContext, Object message, ByteBuf byteBuf) throws Exception {
        byte[] body;
        if (message instanceof String) {
            body = ((String) message).getBytes(StandardCharsets.UTF_8);
        } else if (message instanceof byte[]) {
            body = (byte[]) message;
        } else {
            throw new IllegalArgumentException("不支持的类型:"
                    + message.getClass().getCanonicalName());
        }
        byteBuf.writeByte(startByte);
        byteBuf.writeBytes(body);
        byteBuf.writeByte(endByte1);
        byteBuf.writeByte(endByte2);
    }
}

  

//收到服务端返回消息后的处理,此处逻辑为直接关闭通道,即结束通讯
@ChannelHandler.Sharable
public class MyClientHandler extends SimpleChannelInboundHandler<String> {
    
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        //收到服务器返回信息后,关闭通道。
        ctx.channel().close();
    }
}

  

以上方式为通过各方信息整合后,得到的符合自身需求的一个Netty客户端发送消息的编码,经过了测试和验证,满足发送一条消息到服务端,收到服务端返回信息后关闭通道的需要。

  

标签:Netty,private,char,static,Sokect,new,message,服务端,客户端
From: https://www.cnblogs.com/justbeginning/p/17804871.html

相关文章

  • Redis-GUI [图形化桌面客户端工具]
    推荐一:【Redis图形化桌面客户端下载地址:https://github.com/lework/RedisDesktopManager-Windows/releases】 解压zip文件, 点击exe,正常安装即可,打开页面如下: 推荐二:【Redis图形化桌面客户端下载地址:https://github.com/qishibo/AnotherRedisDesktopManager/releases......
  • mysql客户端---SQLyog
    0.查看所有的库SHOWDATABASES;1.设置客户端连接数据库的字符集SETNAMES'utf8';如果数据子的字符集是utf8,而客户端连接数据库的字符集是latin1,数据库中的中文就会出现乱码,类似?????2.查看当前库下的所有表showtables;SHOWFULLTABLESFROM`abc`WHEREtable_type='B......
  • 如何在 Windows Server 2019 中启用 Telnet 客户端
    如何在WindowsServer2019中启用 Telnet 客户端这篇文章将介绍如何在Microsoft的WindowsServer2019中安装telnet 客户端。启用Telnet客户端首先,我们需要启用telnet客户端,如果我们不启用它,我们将在尝试使用它时得到类似于以下消息的结果。C:\>telnetgoogle.co......
  • Linux时间校准、时间同步(ntpdate及C代码NTP客户端代码校准示例)
    背景机器每次机启后时间就会出现异常,因为机器无法访问外网,只能访问局域网的ntp服务,所以需要保证局域网内部有ntp服务,如何安装ntp服务,参考Ubuntu20.04Ntp服务安装及验证。网络时间协议NetworkTimeProtocol(NTP)是一种确保时钟保持准确的方法。如果可以访问互联网,只需安装ntp......
  • 阿里云argusagent的监控客户端的安装脚本,值得借鉴
    阿里云argusagent的监控客户端的安装脚本agent_install_necs-1.7.sh #!/bin/bashecho"installing"exportLANG=en_US.UTF-8exportLANGUAGE=en_US:#有些系统下安装后可能没有写文件的权限,导致日志文件写入失败ulimit-vunlimitedif[[-z"${VERSION}"]];thenVERS......
  • 客户端远程连接linux
    https://www.cnblogs.com/tankblog/p/6080844.html1.查询linux服务器上是否已经有ssh服务   有服务端和客户端未完待续因为我不会使用vim ......
  • Flink客户端操作
    一、mysql数据准备mysql-hip-uroot-p密码CREATEDATABASEflink;USEflink;CREATETABLEuser(idINTEGERNOTNULLPRIMARYKEY,nameVARCHAR(255)NOTNULLDEFAULT'flink',addressVARCHAR(1024),phone_numberVARCHAR(512),emailVARCHAR(255));INSERT......
  • Win10 ssh客户端 scp 传输linux文件到windows 端
    1Window10安装openssh服务2启动windowssshd服务netstartsshd3scplinux向windows传输文件Win10中打开powershell,登录ssh把linux下的shell01.sh传到window10的桌面上[email protected]:/C:/Users/admin/Desktop......
  • netty同时支持tcp和websocket
    最近接手了别人的netty框架实现的im的一个项目,基于tcp实现通信,但是领导要求做一个网页版的聊天,接入到目前的系统,由于第一次接触这种项目,百度一圈大部分都是通过websocket实现通信的方式,最后通过chatgpt发现确实可以同时支持tcp和websocket,现在把方式放上Netty是一个高性能、异步事......
  • 客户端mock和mock server的区别
    客户端Mock和MockServer是用于模拟数据的两种不同方式。客户端Mock:客户端Mock是指在前端应用中使用JavaScript或其他前端语言编写的代码来模拟接口的返回数据。这种方式不需要搭建服务器,而是直接在前端应用中拦截请求,返回预定义的模拟数据。客户端Mock可以用于开发阶段......