Netty-SocketIO:最好用的Java版即时消息推送(2)-阿里云开发者社区

开发者社区> 沉默王二> 正文

Netty-SocketIO:最好用的Java版即时消息推送(2)

简介: Netty-SocketIO:最好用的Java版即时消息推送
+关注继续查看

###五、注意事项


关于socketio的ssl应用,一直没有弄出来,主要是java的toolkey生成的jks总是不被浏览器识别,socketio提供的例子也不能运行,在各大网站上暂时没有解决问题。可通过浏览器添加https的例外做法来规避错误,但不可取,后面还需要研究。

socketio在浏览器刷新后,旧的连接断开,需要重新建立连接,这个请注意。

客户端session超时后,切记关闭socket,我是通过10分钟一次的扫描进行的session超时验证,该方法不够理想。

server端,在实际应用中,需要将客户端断开的socket进行垃圾清理,注意判断方法如下:

NamespaceClient client = (NamespaceClient) socket;
if (client.getBaseClient().isConnected()) {
    SessionManager.getSession(getSession().getSessionId());
} else {
    logger.warn("web发送心跳包失败,客户端连接线程[" + this.getName() + "]已断开");
    running = false;
    break;
}


整体Netty-SocketIO的Web推送还是非常易于掌握的,但是缺少api,做起来需要不停实践,另外解决问题的方法不多,希望本篇可以给你提供些许帮助。


2017年12月26日补充:


项目迁移到了另外一台阿里云服务器,于是Netty-SocketIO的server在启动的时候出现了以下错误:


java.net.BindException: Cannot assign requested address: bind
    at sun.nio.ch.Net.bind0(Native Method)
    at sun.nio.ch.Net.bind(Unknown Source)
    at sun.nio.ch.Net.bind(Unknown Source)
    at sun.nio.ch.ServerSocketChannelImpl.bind(Unknown Source)
    at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:127)


问题发生在server.start()处,进行javaChannel().bind(localAddress, config.getBacklog());域名和端口绑定时出现了错误:


private SocketIOServer server = null;

server = new SocketIOServer(NetConfigManager.getWebQuotationConfig());// 此处的Configuration对象的Hostname设置的是域名,Port设置为10015


server.start();


最开始从日志里面找出了这样一条消息:


socketio.SocketIOServer$1: SocketIO server start failed at port: 10015!

直觉告诉我,阿里云的安全组在作怪,把10015端口禁掉了。于是我就去改安全组,把10015的入方向和出方向都放开了,但问题依然没有解决。


接下来,我只能丈二和尚摸不着头脑的去百度,他娘的结果没什么可靠的信息,都是一些乱七八糟的东西——什么端口被占用,使用netstat -ano查询端口,还有什么hosts文件要修改,等等,一系列坑爹又不负责任的答案。


折腾了接近四个半小时的时间,我™几乎要疯了,脑子一股热血升腾,恨不得把鼠标给砸了。


在气晕的状态下,我努力的控制着自己,问:“明明上一台阿里服务器的时候,这样配置,socketio就是正常的,现在怎么™就error了?”


试着让自己恢复冷静,就能想到办法。“不是端口的问题,那肯定是域名的问题!”


我试了试“localhost”,发现SocketIOServer竟然start成功了!????这说明什么问题,说明域名没有localhost的权限!但改成localhost有毛用,客户端不可能访问到服务器的localhost啊?


接着,我想到了IP地址!!!!!把域名换成公网的IP地址,竟然™的SocketIOServer start成功了!!!!


此时有两种解决方案,一是使用IP来替代域名,另外一个就是继续找域名的解决方案——一个不懂网络的程序员注定在网络安全方面吃点亏!,我™就是受害者之一。


好了,问题记录就先到这里——解决问题的最好办法就是让自己冷静下来!!!!


2018年9月11日补充:


由于项目在tomcat服务器的访问前缀由原来的http改为https,导致客户端的socketio无法正常访问到Netty-SocketIO服务器端。从昨天到今天,整整两天,一直在寻找解决方案,现在事情终于有所转机,为了更多小伙伴的需要,就把问题整理备案。


由于https下不允许使用http访问,所以Netty-SocketIO服务器端需要从http升级到https,具体的实例该怎么做呢?

demo可参照https://github.com/mrniko/netty-socketio-demo/blob/master/server/src/main/java/com/corundumstudio/socketio/demo/SslChatLauncher.java,但据我的实战情况来看,该官方实例无法在本地正常运行,也就是说,官方提供的https解决方案在本地是行不通的,但官方实例提供了一个keystore.jks,如果小伙伴们对keystore.jks不熟悉的话,可以先借用该jks。


有了jks,我们可以先将Server端升级到https,也就是ssl(非常抱歉,对https和ssl我还不是很清楚,但并不妨碍我将实例运行起来)。


Configuration config = new Configuration();
config.setPort(10015);
// 注意不要指定config.setHostname
// 具体原因不清楚,不得不再说一声抱歉,我在网络方面就是一个白痴,比如说我不懂hosts文件是干嘛的,也不懂内网和外网之间的区别,总之这一块使我非常焦虑,只好一步步组合方案进行试验,换句话说理论知识不够,只能靠不断试错来总结经验
// keystore.jks的密钥
config.setKeyStorePassword("test1234");
InputStream stream = new FileInputStream(new File("/home/soft/keystore.jks"));
config.setKeyStore(stream);
// 升级为https
server = new SocketIOServer(config);


然后我们来看客户端


var socket =  io.connect('https://147.101.128.223:10015');

// 使用https而不再是http,然后紧接着是服务器的外网地址,不知道为什么,然后是对应的端口


现在,已经可以通过https来访问到socketio的服务器端了。




但遗憾的是:地址栏中的https竟然变成了不安全的状态!!!!!


2018年9月14日补充:


之前的补充当中说https的地址栏变成了不安全的状态,其实是jdk的域名不匹配,如果jks把项目实际的域名匹配上的话,就不再提示不安全了!

另外,socketio的client在链接的时候可以使用域名链接,而不只是ip地址,如下:


var socket = io.connect("cmower.com");

1

需要特别注意的是,Netty-SocketIO的服务器端在配置config的时候,不要指定hostname,切记!!!!


如果在启动Server的时候发现:


java.net.BindException: Address already in use

at sun.nio.ch.Net.bind0(Native Method)

at sun.nio.ch.Net.bind(Net.java:433)

at sun.nio.ch.Net.bind(Net.java:425)

at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)

at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:127)

at io.netty.channel.AbstractChannel A b s t r a c t U n s a f e . b i n d ( A b s t r a c t C h a n n e l . j a v a : 554 ) a t i o . n e t t y . c h a n n e l . D e f a u l t C h a n n e l P i p e l i n e AbstractUnsafe.bind(AbstractChannel.java:554) at io.netty.channel.DefaultChannelPipeline AbstractUnsafe.bind(AbstractChannel.java:554)atio.netty.channel.DefaultChannelPipelineHeadContext.bind(DefaultChannelPipeline.java:1258)

at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:511)

at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:496)

at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:980)

at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:250)

可以查看是否有其他的进程占用了地址?


举个例子,在我的项目当中,如果我先启动了Tomcat,那么Netty-SocketIO的Server就会提示以上错误;假如我先启动Netty-SocketIO的Server,再启动Tomcat,两者就都正常!


所以,以上建议,请特别注意!!!!


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10089 0
AngularJS+ASP.NET MVC+SignalR实现消息推送
原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景   OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户。 技术选择   最开始发现的是firebase,于是很兴奋的开始倒腾起来。
1425 0
C++中消息自动派发之一 About JSON
1. 闲序   游戏服务器之间通信大多采用异步消息通信。而消息打包常用格式有:google protobuff,facebook thrift, 千千万万种自定义二进制格式,和JSON。前三种都是二进制格式,针对C++开发者都是非常方便的,效率和包大小(数据冗余度)也比较理想。
870 0
APNS IOS 消息推送JSON格式介绍
在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送。下面积累了我在进行apns推送时候总结的 apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 aps 字典。
1922 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13891 0
C++中消息自动派发之三 About JSON Encode
  《C++ 消息自动派发》系列上篇介绍了IDL解析器,生成的C++代码只支持JSON转C++ struct。 经过新的重构,这次增加了对C++ struct 转JSON的支持。IDL解析器自动为C++ struct生成两个方法。
849 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11893 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
7365 0
+关注
沉默王二
微信搜索「沉默王二」,回复关键字「00」获取硬核计算机基础资料。
1084
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础HTML入门教程》
立即下载
《零基础CSS入门教程》
立即下载