首页 > java怎么实现长连接

java怎么实现长连接

譬如一个客服系统,客户端发送请求响应之后服务器就会丢失这个连接,如何做到当客服第一次发送请求后就保持长连接状态,待到谈话结束后再释放改连接


楼主说的是HTTP连接吧,HTTP连接本身的request/response模式设计就是短链接的,即服务器端响应之后断开连接。

若要做长连接,在没有具体业务的情况下,最基础的就是建立java.net.Socket连接,自己制定协议来控制断开。服务器端的实现老的有标准IO(java.net.*),新的有NIO(java.nio.*)。有具体业务时可以考虑一些成熟的协议来实现,如XMPP等。

如果既希望使用HTTP协议,又想做长连接,那么可以参考以下《高性能网站建设进阶指南》第八章关于Comet的内容(虽是前端的书,但对后端开发也有借鉴意义)


Java简单实现长连接很简单, 实现一些回调机制就可以了. 问题是Java如何设计一个生产环境下可用的长链接, 不是代码测试通过了就可以上线的.

想要完美的解决这个问题, 你需要一个支持单线程异步的编程框架, Java一定写的出来(或许已经有人写出来了但是我还不知道)

在标准的 Apache + mod_php 环境中也可以通过 sleep 来模拟出需要过很久才 response 返回的http请求, 很简单. 但是在生产环境的 PHP 中使用 sleep 无异于自杀. apache php 的多进程意味着你有多少个请求就需要开多少个进程, 或者再退一步 多进程+多线程. 无论哪种方法, 你的CPU将处于疯狂的任务切换中, 实际上并没有干多少活确被活活累死了.

所以在这种事实面前, 你需要了解你的Java代码当前的运行模式, 长链接面前, 多线程是不可取的.

早期的 python 世界尝试解决这样的问题, 动用了stackless python的微线程, 后来tornado框架采用纯异步编程的方式一样解决了这个问题, 无需hack python本身.
另外一方面, erlang 也利用自身的微线程特性实现了超高的并发连接数.
node.js 的方式和 tornado 很像, 单线程异步.
go语言也类似, 利用了异步方式解决了问题.

所以问题又回到Java, 如何在实战中支持长链接, 取决于你如何使用CPU, 是采用平分CPU时间的方式, 还是根据事件来切换任务.


html5包含了websocket机制,专门用来解决这个问题,楼主可以搜索参考下。如果没办法用html5,就是楼上说的comet机制。


推荐使用netty的nio框架https://netty.io/


发心跳包。每隔几秒就发一个数据包过去,这是通讯常见问题。


我们当前的实现方式可能和楼上几位不同,我们现在使用的是pushlet

pushlet和comet是我知道并使用过的两个长连接框架,个人偏向pushlet。

另,如果使用这些框架,那么在前端(页面)和后端(服务)都要进行改变,需要视自己的实际情况使用。效果还是不错的。

希望有帮助。

【热门文章】
【热门文章】