helloworld_xwb 2018-05-06 05:10 采纳率: 0%
浏览 3161
已结题

netty客户端与服务端连接后的通信

最近做的项目学习netty,时间紧来不及学,希望请教大家一些问题,
1.netty的客户端与服务端建立长连接后,客户端如何与服务端通信?要随心所欲发送自定义的消息?
2.netty的自定义编码器,解码器,希望也能得到帮助,
3.第一个问题为主要问题。

数据包结构:
包头:2字节 0ddd 0fff。
消息体:全部为文本(ASCII码),汉字是GB2312编码。
包尾:2字节 0xxx 0aaa。

最后,先感谢每一位浏览解答的朋友,我会多多赠送C币给那些乐于帮助的人。

补充一些:
我是客户端,需要与服务端长连接;接通后需要发送登陆消息数据包;
每30秒发送一条链路数据

这些我熬夜两天,时间太紧张,希望大家不吝指教。
  • 写回答

9条回答 默认 最新

  • helloworld_xwb 2018-05-06 05:15
    关注

    客户端代码:
    public class TCPClient {

        public void connect(int port,String host)throws Exception{
            //网络事件处理线程组
            EventLoopGroup group=new NioEventLoopGroup();
            try{
                //配置客户端启动类
                Bootstrap b=new Bootstrap();
                b.group(group).channel(NioSocketChannel.class)
                        .option(ChannelOption.TCP_NODELAY, true)//设置封包 使用一次大数据的写操作,而不是多次小数据的写操作
                        .handler(new ChannelInitializer<SocketChannel>() {
                            @Override
                            protected void initChannel(SocketChannel ch) throws Exception {
                                ch.pipeline().addLast(new DealMsg());//设置自定义解码器
                                ch.pipeline().addLast(new TCPClientHandler());//设置客户端网络IO处理器
                            }
                        });
                //连接服务器 同步等待成功
                ChannelFuture f=b.connect(host,port).sync();
    
                //同步等待客户端通道关闭
                f.channel().closeFuture().sync();
            }finally{
                //释放线程组资源
                group.shutdownGracefully();
            }
        }
    

    }

    客户端handler

    public class TCPClientHandler extends ChannelHandlerAdapter {

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("通信异常!!");
        cause.printStackTrace();
    }
    
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("链接服务端成功!");
    }
    
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("退出链接!!");
    }
    
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
    
        System.out.println("接受服务器数据:=="+msg);
    
    }
    
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        ctx.channel().writeAndFlush("数据读取完成!");
    }
    

    }

    评论

报告相同问题?

悬赏问题

  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入