SpringBoot整合Netty服务端在Tomcat运行实坑经历_打豆豆的小老鼠的博客-程序员宅基地

技术标签: java  远程通讯  springboot  netty  

SpringBoot整合Netty

公司是做人工智能人脸识别技术落地的,上周确定要做设备的远程控制,android端推荐使用netty,如是坑开始了~~~

第1天
netty服务的代码网上已经烂大街了,在此不赘述,但是!!!
netty服务搭建后无法保持长连接,客户端发完消息就断开连接

……

第1+n天
android大哥看不下去了
因为我用的netty4,遂推荐我使用5,本地测试没问题,整合至springBoot的时候出现版本冲突,无法解决(ps:最后发现项目用了redis,底层应该用了netty通讯),netty5卒

又回到4上,结果大哥的netty代码毫无问题,就给我用了,整合至本地没问题,废话不多说贴代码
server:

@Component
public class EchoServer implements onChannelOperation {
    @Value("${netty.port}")
    private  int port;
    private static final Logger log= LoggerFactory.getLogger(EchoServer.class);
    private EventLoopGroup bossGroup = new NioEventLoopGroup();
    private EventLoopGroup workerGroup = new NioEventLoopGroup();
    //public List<NettyServerHandler> socketList = new ArrayList();
    private static final ConcurrentHashMap<NettyServerHandler,SocketChannel> channelMap= new ConcurrentHashMap<>();
    
    public void run() {
     /*   EventLoopGroup bossGroup = new NioEventLoopGroup(); // 用于处理服务器端接收客户端连接
        EventLoopGroup workerGroup = new NioEventLoopGroup(); // 进行网络通信(读写)*/
        try {
            Thread t=Thread.currentThread();
           log.info("run() in EchoServer"+ Calendar.getInstance().getTime()+"___"+t.getName());
            ServerBootstrap bootstrap = new ServerBootstrap(); // 辅助工具类,用于服务器通道的一系列配置
            bootstrap.group(bossGroup, workerGroup) // 绑定两个线程组, 绑定线程池
                    .channel(NioServerSocketChannel.class) // 指定NIO的模式
                    .childHandler(new ChannelInitializer<SocketChannel>() { // 配置具体的数据处理方式
                        @Override // 这个方法里,连接一个客户端,进入一次,连接一个客户端进入一次
                        protected void initChannel(SocketChannel socketChannel) throws Exception {
                            log.info("有客户端连接了:" + socketChannel);
                            // 设置超时时间,可选
                            // socketChannel.pipeline().addLast(new IdleStateHandler(READ_IDEL_TIME_OUT,
                            //  WRITE_IDEL_TIME_OUT, ALL_IDEL_TIME_OUT, TimeUnit.SECONDS));
                            NettyServerHandler scobj = new NettyServerHandler(EchoServer.this); //设置监听
                            socketChannel.pipeline().addLast(scobj);
                            //socketList.add(scobj);
                            channelMap.put(scobj,socketChannel);
                            log.info("socket通道数量:" + "--"+channelMap.size());
                        }
                    })
                  
                    .option(ChannelOption.SO_BACKLOG, 32 * 1024) // 设置TCP缓冲区
                    .option(ChannelOption.SO_SNDBUF, 64 * 1024) // 设置发送数据缓冲大小
                    .option(ChannelOption.SO_RCVBUF, 64 * 1024) // 设置接受数据缓冲大小
                    .childOption(ChannelOption.SO_KEEPALIVE, true); // true保持连接, false no
            //.childOption(ChannelOption.ALLOW_HALF_CLOSURE, true); // 允许半关闭socket即可。默认为false,客户端shutdownoutput时,SocketChannel.read(..)
            ChannelFuture future = bootstrap.bind(port).sync();
           log.info("服务器启动成功,监听端口号:" + port);
            future.channel().closeFuture().sync();// 关闭服
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_31707781/article/details/96979038

智能推荐

调用K3Cloud webapi_weixin_30947043的博客-程序员宅基地

public class K3CloudWebApi { #region 表单保存、提交、审核 /// <summary> /// 验证登陆 /// </summary> /// <param name="context"></param>..._client.submit("bd_material",

springcloud(一):大话Spring Cloud_2019 spring cloud_xiaobolihuan的博客-程序员宅基地

研究了一段时间Spring Boot了准备向Spring Cloud进发,公司架构和项目也全面拥抱了Spring Cloud。在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统构建的要求,使我们以非常低的成本(技术或者硬件)搭建一套高效、分布式、容错的平台,但Spring Cloud也不是没有缺点,小型独立的项目不适合使用。Spring Cloud是什么鬼?Spri..._2019 spring cloud

Qt学习之路——— Qt键盘、鼠标事件的处理_南方的小清湖的博客-程序员宅基地

事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。对于初学者,总会对Qt中信号和事件的概念混淆不清。其实,记住事件比信号更底层就可以了。比如说,我们用鼠标按下界面上的一个按钮,它会发射clicked()单击信号,但是,它怎么知道自己被按下的呢,那就是通过鼠标事件处理的。这里可以看到,鼠标事件比信号更底层。 在Qt中处理事件有多种方法,不过最常用的是重写Qt

H264画质分类_h.264hp和h.264bp_路儿的博客-程序员宅基地

H264分为BP、EP、MP、HP四种画质_h.264hp和h.264bp

HDU1002_MrBlankIsAwesome的博客-程序员宅基地

A + B Problem IITime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 275474 Accepted Submission(s): 53177Problem Description I have a very simpl

面试难点:你了解乐观锁和悲观锁吗?-程序员宅基地

前言乐观锁和悲观锁问题,是出现频率比较高的面试题。本文将由浅入深,逐步介绍它们的基本概念、实现方式(含实例)、适用场景,以及可能遇到的面试官追问,希望能够帮助你打动面试官。目录一、基本概念二、实现方式(含实例)三、优缺点和适用场景四、面试官追问:乐观锁加锁吗?五、面试官追问:CAS有哪些缺点?六、总结一、基本概念乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问...

随便推点

ubantu16.04 安装mysql 外部主机无法连接的问题_xiaohajunsky的博客-程序员宅基地

近期准备打算装用虚拟机搭建一个web服务器环境做测试,使用的事ubantu16.04 server版,web环境APACHE+php+mysql,但是按照网上的教程安装后无法用其他ip登录mysql,主要问题有以下两点1.首先使用navicat直接连接会被告知can't connect to mysql server on‘xx.xx.xx.xx’这里的问题是由于数据库暂时不允许外部ip访问解决方...

C++学习笔记【十八】—— 类成员函数public_c++ 一个类可以定义函数 在public的父类中没有的吗_Comma_dev的博客-程序员宅基地

类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数有两种定义方法:将函数定义在类的内部将函数定义在类的外部,单独使用范围解析运算符 :: 来定义将函数定义在类的内部在类定义中定义的成员函数是把函数声明为内联的,即便没有使用 inline 标识符。例程如下:class Box{ public: double length; // 长度 double breadth; // 宽度 doubl_c++ 一个类可以定义函数 在public的父类中没有的吗

win7 64位安装redis 及Redis Desktop Manager使用_小学生009的博客-程序员宅基地

写基于dapper的一套自动化程序,看到 mgravell 的另一个项目,StackExchange.Redis,之前在.NET上用过一段时间Redis,不过一直是其它的驱动开发包,这个根据作者介绍,是个高性能的线程安全的.NET c#开发redis客户端的库。说的很吊,不过我确信mgravell出品的东西都是精品。说多无益,先把redis在win上的开发环境搭一下。redis官方没有

停止手打所有cpp文件到android.mk_tianxiawuzhei的博客-程序员宅基地

做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk前言:”懒”在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! 一.懒人说书Android.mk中LOCAL_SRC_FILES需要罗列出所有参

Java学习(六)Java中高级操作_怎么修改java中高级_hxl0925的博客-程序员宅基地

一、Collection1、定义: 一个动态的对象数组,集合中的对象内容可以任意扩充。。特点:性能高、容易扩展和修改。常用子类:List和Set。2、子类——List(1)可存放任意的数据,而且在List接口中内容是可以重复的。(2)子类:ArrayList 和Vector(3)常用操作: 判断集合是否为空:boolean ..._怎么修改java中高级

C#实现QQ群成员列表导出及邮件群发之模拟QQ登陆_tekucong的博客-程序员宅基地

前言本文的重要部分:1、抓包获取QQ空间或者邮箱登陆地址,分析参数,用户名,密码,验证码,gtk,随即数。2、获取每次登陆需要的验证码3、用户名,密码,验证码加密得到登陆密码4、Http模拟登陆拿cookie本文实验的思路也可换另一种方式,抓包获取登陆的js,用代码操作js来计算密码 ,gtk等实现登陆。抓包1、我们来访问qq空间的地

推荐文章

热门文章

相关标签