jsp长连接
① 如何干净的实现Android/Java Socket 长连接通信
所谓长连接,它通常包含以下几个关键过程:
轮询的建立
建立轮询的过程很简单,浏览器发起请求后进入循环等待状态,此时由于服务器还未做出应答,所以HTTP也一直处于连接状态中。
2. 数据的推送
在循环过程中,服务器程序对数据变动进行监控,如发现更新,将该信息输出给浏览器,随即断开连接,完成应答过程,实现“服务器推”。
3. 轮询的终止
轮询可能在以下3种情况时终止:
3.1. 有新数据推送
当循环过程中服务器向浏览器推送信息后,应该主动结束程序运行从而让连接断开,这样浏览器才能及时收到数据。
3.2. 没有新数据推送
循环不能一直持续下去,应该设定一个最长时限,避免WEB服务器超时(Timeout),若一直没有新信息,服务器应主动向浏览器发送本次轮询无新信息的正常响应,并断开连接,这也被称为“心跳”信息。
3.3. 网络故障或异常
由于网络故障等因素造成的请求超时或出错也可能导致轮询的意外中断,此时浏览器将收到错误信息。
4. 轮询的重建
浏览器收到回复并进行相应处理后,应马上重新发起请求,开始一个新的轮询周期。
客户端代码片段
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="author" content="hoojo & http://hoojo.cnblogs.com"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <%@ include file="/tags/jquery-lib.jsp"%> <script type="text/javascript"> $(function () { window.setInterval(function () { $.get("${pageContext.request.contextPath}/communication/user/ajax.mvc", {"timed": new Date().getTime()}, function (data) { $("#logs").append("[data: " + data + " ]<br/>"); }); }, 3000); }); </script> </head> <body> <div id="logs"></div> </body> </html>
服务器端代码
@RequestMapping("/ajax") public void ajax(long timed, HttpServletResponse response) throws Exception { PrintWriter writer = response.getWriter(); Random rand = new Random(); // 死循环 查询有无数据变化 while (true) { Thread.sleep(300); // 休眠300毫秒,模拟处理业务等 int i = rand.nextInt(100); // 产生一个0-100之间的随机数 if (i > 20 && i < 56) { // 如果随机数在20-56之间就视为有效数据,模拟数据发生变化 long responseTime = System.currentTimeMillis(); // 返回数据信息,请求时间、返回数据时间、耗时 writer.print("result: " + i + ", response time: " + responseTime + ", request time: " + timed + ", use time: " + (responseTime - timed)); break; // 跳出循环,返回数据 } else { // 模拟没有数据变化,将休眠 hold住连接 Thread.sleep(1300); } } }
② jsp如何接收java后台发过来的json,jsp没有发任何请求,只接受后台的json
一般情况下,我们都是从前台请求后台数据--->前端请求后端。
你的意思我没理解错的话专就是想后端属直接请求前端。这种需求一般是在做消息推送,聊天或站内信时会用到。
符合这个逻辑的有一种技术。叫DWR,DWR的反转AJAX功能允许我们从服务器端来控制客服端,而不需要客户端的请求,服务器可以自动把消息发给指定的客户端。DWR的Push技术是让服务器每次发送广播时,把这个广播推送给客户端,而不用客户端去刷新,DWR的推送是基于长连接的,性能优越。
③ 为什么php,jsp很少用于游戏服务端的开发
到底是“项目用什么语言,取决于开发成员对语言的熟悉度,哪种语言熟版悉用哪种。游戏服务端的语言选权择也是这样。”还是“长连接和短连接在长时间游戏客户端和游戏服务端频繁交换数据上的优劣导致”还是其他原因导致php,jsp很少用于游戏服务端的开发?
短
连接就导致了某些游戏根本无法使用http协议进行通讯,这个“某些”中就包括了人民群众喜闻乐见的arpg,因此导致了使用php和jsp进行服务器开
发的团队有着局限性。弱交互(棋牌类)游戏还是可以使用http 加 轮询来实现。当然可能一辈子就只能做弱交互的了(大部分手游就是这样)。
④ jsp,怎么获取客户端离开某个jsp页面或者servlet或者action,进入的时候到是好办。
这个问题是需要写一个大小为1的iframe,定时刷新,没有内容但是服务器可以根回据参数获得所答在页面,甚至其他用户行为。
间隔越短越精确,耗费资源越多。
然后在离开页面的时候有个事件,可以在这个事件中给服务器发消息,告诉服务器离开的目的地。
这个功能肯定不是用长连接的,不同的应用场合
⑤ jsp有没有类似websocket的技术,但浏览器兼容性比websocket好;不要用单纯的ajax
问题一:
jsp中没有,webscoket是html5中的内容了。
两种方式解决你想要做的程序:内
a、前台jsp或者html通过容js轮询,发送ajax请求到后台。
b、通过http的长连接实现,具体可以参考dwr2中的服务器推技术,下载dwr的demo其中就有示例代码及说明。
⑥ tomcat获得正在运行的socket长连接对象,
这个容易来 运行一个serverlit即可 不需要自tomcat直接与 C++ ServerSocket通讯 要知道 没有推送到浏览器这一说 http协议决定了这一点 必须是浏览器触发请求 http才可以建立 而且 更重要的是 http的长连接很不稳定 既然是浏览器的请求触发那就好办了, 不管是ajax还是普通的request 只需要对齐请求的serverlet或者jsp编码即可 在jsp中直接使用java socket与C++serversocket通讯即可 将获取的信息直接按照你的view格式写入response 既稳定 又安全
⑦ 能不能在jsp中中创建个tcp长连接,连接单片机,网页接收用户通过浏览器发来的数据,通过tcp发送给单片机
兄弟,搞定了没?如果服务器那边用的是TCPClient的我有,用TCPServer的正在研究,如果你搞定了,给我分享下,谢谢!
⑧ jsp是否可以和后端建立长连接
需要支持websocket的浏览器,或者采用其他长连接的js框架。
⑨ PHP中如何实现与服务器的长连接呢 - PHP进阶讨论
在使用永久连接时还有一些特别的问题需要注意。例如在永久连接中使用数据表锁内时,如果脚本不容管什么原因无法释放该数据表锁,其随后使用相同连接的脚本将会被永久的阻塞,使得需要重新启动 httpd 服务或者数据库服务。另外,在使用事务处理时,如果脚本在事务阻塞产生前结束,则该阻塞也会影响