`
xiaoZ5919
  • 浏览: 405464 次
  • 性别: Icon_minigender_1
  • 来自: 安平人@北京
博客专栏
Group-logo
Netty学习笔记
浏览量:73253
社区版块
存档分类
最新评论

基于Netty实现CometStreaming方式的聊天室

阅读更多

       这段时间在研究web服务器消息推送,除了html5的websocket,comet是一项很好的方案。comet不是一项专门的技术,更像是一个解决方案。说来也简单,服务端需要能把connection hold,浏览器也需要特殊的支持保持从服务端获取数据,幸好用xmlhttprequest,ajax的实现也是靠它。comet一般有两种方式long poll和streaming。长轮询是client发起请求以后,服务端发现没有数据要发给客户端就先hold起来,直到数据要发给client,请求本次请求。客户端需要不断的发起这样的请求。长轮询相比定时发起的短轮询显然能减少对服务器的请求。注意虚线部分有一个close的动作,然后再发起一次请求。




    另外一种方式是streaming,从名字上就看出,他是在建立长连接以后源源不断地从服务端接收数据。而不需要关闭再重现建立。不过这种方式也有点限制Streaming方式需要responseText有内容或者内容不同于上次时触发readyStateReady,IE在内容改变时不会触发readyStateChange,这样就接收不到新的内容。


 
     Netty对http支持的很好,自带的httpstaticfileserver的例子甚至可用来做来开发环境的静态服务器。
用它来实现comet只是稍加改造的事儿,所以我试着用来实现了一个聊天室的例子,类似jetty的聊天室。想法很理想,实现起来还是遇到了一点问题。
     1. 想要源源不断向浏览器写数据,那不能用content-length这样的length header的编码方式,而得用chunked方式。期间深入了解了一下chunked编码的方式。以及在netty中如何使用chunk
     2. 开始的设想使用一个长连接接收聊天信息也发送聊天信息 。后来发现这样使不可能。接收信息采用一个长连接,而发送消息采用短链接。
     3. xmlhttprequest的readyState状态有5中分别是0-4,2是收到所有的header并解析。3是开始接收body中的内容。在Chrome下运行正常反而在ff下不能好好的运行,后来仔细查看一番firefox的xmlhttprequest的文档发现用错了一个参数multipart,这个参数貌似只在ff下有。
     



 

 
    代码也很简单,好多代码都是从tomcat的comet例子中借鉴过来。我打了包放在附件中,感兴趣的可以看看,运行以后打开http://localhost:8080/chat.html访问。代码比较丑乱,注重功能的实现。可以在googlecode上查看http://code.google.com/p/netty-rpc/的cometserverhandler




    






  • 大小: 15.1 KB
  • 大小: 9.9 KB
  • 大小: 9.9 KB
  • 大小: 8.5 KB
0
1
分享到:
评论
12 楼 liulangdeyu999 2013-03-18  
楼主,我是说在xp下面, .sh后缀的是 Linux下面的东东吧
11 楼 xiaoZ5919 2013-03-14  
liulangdeyu999 写道
这个东西怎么运行

bin文件夹下有一个runComet.sh脚本 修改其中-Dudir静态文件的路径为bin文件夹所在的目录
10 楼 liulangdeyu999 2013-03-14  
这个东西怎么运行
9 楼 liangcoder 2013-01-07  
WebSocket没具体实现过,因为浏览器兼容性问题,可用性很低。
8 楼 xiaoZ5919 2013-01-07  
liangcoder 写道
xiaoZ5919 写道
liangcoder 写道
xiaoZ5919 写道
我觉得实减少请求不是主要的,实现能从消息产生了能从服务器推送到浏览器才是主要的。长轮询,服务端维持连接,直到有消息产生。假设两条消息之间的间隔是1分钟(其实间隔是不定的),假设用短轮询的话每隔五秒请求一次,会请求多次。

关于请求超时的设定,有什么建议么?服务端要维持客户端连接,负载又有什么需要考虑的因素呢?ps:event push的可行性固然重要,但可用性呢?

说实话,我只是实现了概念的原型,这些问题都没有深想过。这些只能通过在测试中摸索了,给我的感觉streaming是可行的,你有什建议吗?我最近正打算做消息推送

对于Streaming,我只知道浏览器兼容性是个问题。Long-Polling克服了这个缺陷。

嗯 我也考虑了这个问题,websocket你使用过吗
7 楼 liangcoder 2013-01-07  
xiaoZ5919 写道
liangcoder 写道
xiaoZ5919 写道
我觉得实减少请求不是主要的,实现能从消息产生了能从服务器推送到浏览器才是主要的。长轮询,服务端维持连接,直到有消息产生。假设两条消息之间的间隔是1分钟(其实间隔是不定的),假设用短轮询的话每隔五秒请求一次,会请求多次。

关于请求超时的设定,有什么建议么?服务端要维持客户端连接,负载又有什么需要考虑的因素呢?ps:event push的可行性固然重要,但可用性呢?

说实话,我只是实现了概念的原型,这些问题都没有深想过。这些只能通过在测试中摸索了,给我的感觉streaming是可行的,你有什建议吗?我最近正打算做消息推送

对于Streaming,我只知道浏览器兼容性是个问题。Long-Polling克服了这个缺陷。
6 楼 xiaoZ5919 2013-01-07  
liangcoder 写道
xiaoZ5919 写道
我觉得实减少请求不是主要的,实现能从消息产生了能从服务器推送到浏览器才是主要的。长轮询,服务端维持连接,直到有消息产生。假设两条消息之间的间隔是1分钟(其实间隔是不定的),假设用短轮询的话每隔五秒请求一次,会请求多次。

关于请求超时的设定,有什么建议么?服务端要维持客户端连接,负载又有什么需要考虑的因素呢?ps:event push的可行性固然重要,但可用性呢?

说实话,我只是实现了概念的原型,这些问题都没有深想过。这些只能通过在测试中摸索了,给我的感觉streaming是可行的,你有什建议吗?我最近正打算做消息推送
5 楼 liangcoder 2013-01-07  
xiaoZ5919 写道
我觉得实减少请求不是主要的,实现能从消息产生了能从服务器推送到浏览器才是主要的。长轮询,服务端维持连接,直到有消息产生。假设两条消息之间的间隔是1分钟(其实间隔是不定的),假设用短轮询的话每隔五秒请求一次,会请求多次。

关于请求超时的设定,有什么建议么?服务端要维持客户端连接,负载又有什么需要考虑的因素呢?ps:event push的可行性固然重要,但可用性呢?
4 楼 xiaoZ5919 2013-01-07  
嗯! 我表达的有些问题吧没有把comet要解决的问题表达出来。理解的不深刻
3 楼 xiaoZ5919 2013-01-07  
我觉得实减少请求不是主要的,实现能从消息产生了能从服务器推送到浏览器才是主要的。长轮询,服务端维持连接,直到有消息产生。假设两条消息之间的间隔是1分钟(其实间隔是不定的),假设用短轮询的话每隔五秒请求一次,会请求多次。
2 楼 liangcoder 2013-01-07  
“长轮询相比定时发起的短轮询显然能减少对服务器的请求” 这个显然有点无法理解,能进一步解释下么?
1 楼 liangcoder 2013-01-07  
“长轮询相比定时发起的短轮询显然能减少对服务器的请求”

相关推荐

    基于java+Netty实现的WebSocket聊天室+支持几万人同时在线聊天无压力+源码+文档+服务端+客户端(高分优秀项目)

    基于java+Netty实现的WebSocket聊天室+支持几万人同时在线聊天无压力+源码+文档+服务端+客户端,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 基于...

    基于Netty的GUI版聊天室

    【标题】"基于Netty的GUI版聊天室"是一个实现多用户实时通信的项目,它利用了Netty框架和图形用户界面(GUI)技术。Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端...

    JAVA基于Netty实现的聊天室

    【Java基于Netty实现的聊天室】是一种使用Java编程语言并借助Netty框架构建的实时通信应用。Netty是一个高性能、异步事件驱动的网络应用框架,为开发高并发、低延迟的网络应用提供了强大的支持。这个简易聊天室项目...

    基于Netty实现的命令行斗地主游戏,为划水摸鱼而生.zip

    基于Netty实现的命令行斗地主游戏,为划水摸鱼而生~ 基于Netty实现的命令行斗地主游戏,为划水摸鱼而生~ 基于Netty实现的命令行斗地主游戏,为划水摸鱼而生~ 基于Netty实现的命令行斗地主游戏,为划水摸鱼而生...

    基于 Java Netty实现的可用于内网穿透的代理工具.zip

    基于 Java Netty实现的可用于内网穿透的代理工具.zip基于 Java Netty实现的可用于内网穿透的代理工具.zip基于 Java Netty实现的可用于内网穿透的代理工具.zip基于 Java Netty实现的可用于内网穿透的代理工具.zip基于...

    基于netty实现的web框架

    【标题】:“基于Netty实现的Web框架” 在IT领域,构建高性能、高并发的网络应用是关键。Netty作为一个强大的异步事件驱动的网络应用框架,为Java开发者提供了高效且灵活的基础,使得构建Web框架变得更为便捷。本...

    基于Netty实现的内网穿透&反向代理的工具 (支持TCP上层协议和HTTP的穿透式反向代理).zip

    基于Netty实现的内网穿透&反向代理的工具 (支持TCP上层协议和HTTP的穿透式反向代理).zip

    基于Netty实现的MQTT客户端_netty-mqtt-client.zip

    基于Netty实现的MQTT客户端_netty-mqtt-client

    java基于netty实现的在线网络聊天室源码.zip

    Java基于Netty实现的在线网络聊天室是一种高效、可扩展的网络通信解决方案。Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。这个源码项目展示了如何利用Java和...

    基于Netty实现的文件上传

    在"基于socket通信的源码"中,我们可以看到如何使用Netty实现基于TCP的Socket通信。TCP是一种面向连接的、可靠的传输层协议,确保了数据的有序性和无损性。Netty中的NioSocketChannel和NioServerSocketChannel就是对...

    基于Netty实现了dubbo rpc

    【标题】基于Netty实现Dubbo RPC 在分布式系统中,RPC(Remote Procedure Call)是一种常见且重要的通信机制,它允许一个程序调用另一个在不同进程中运行的程序,就像调用本地函数一样简单。Dubbo作为阿里巴巴开源...

    基于Java的netty+websocket在线聊天室设计源码

    netty+websocket在线聊天室:基于Java构建,包含282个文件,其中包括205个GIF图像、29个...该项目实现了基于netty和websocket的在线聊天室功能,支持动态更新和实时通讯。如需了解更多最新动态,请加入QQ群275846351。

    JAVA版基于netty的物联网高并发智能网关.zip

    JAVA版基于netty的物联网高并发智能网关 JAVA版基于netty的物联网高并发智能网关 JAVA版基于netty的物联网高并发智能网关 JAVA版基于netty的物联网高并发智能网关 JAVA版基于netty的物联网高并发智能网关 JAVA...

    netty实现的聊天代码

    在这个“netty实现的聊天代码”中,我们可以深入理解如何使用 Netty 框架来构建简单的聊天应用。这个 demo 包括了 server 和 client 两部分,都是基于 Java 语言编写的,因此也涉及到了 Java 编程。 首先,让我们从...

    基于netty+websocket+springboot的实时聊天系统项目源码.zip

    1、基于netty+websocket+springboot的实时聊天系统项目源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...

    Netty实现Netty+http+websocket聊天室案例

    文章的对应博客https://blog.csdn.net/weixin_43333483/article/details/127716359#comments_25224363 启动后访问:http://localhost:8088/ 就可开始进行聊天

    基于netty实现的支持长连接的rpc

    标题中的“基于netty实现的支持长连接的rpc”是指利用Netty框架构建一个远程过程调用(RPC)系统,该系统能够维持长时间的连接状态,提高通信效率。Netty是一个高性能、异步事件驱动的网络应用程序框架,适用于开发...

    netty实现多人聊天室,有gui界面

    在这个项目中,"netty实现的多人聊天室,有gui界面",开发者利用Netty的强大功能构建了一个支持多用户同时在线交流的聊天系统,并且配备了图形用户界面(GUI),使得用户交互更加直观易用。 首先,我们要理解Netty...

    基于Java开发的一款基于Netty的内网穿透工具,主要用于将内网服务反向代理到公网访问.zip

    在Java中,我们可以利用Socket编程来实现网络通信,但Netty提供了一种更高级、更优化的方式来处理网络连接和数据传输。 Netty的核心概念包括事件驱动模型、非阻塞I/O以及Channel、Pipeline和Handler等组件。事件...

Global site tag (gtag.js) - Google Analytics