Ajax长连接

这种技术又叫反向Ajax,能够模拟服务器端想客户端的推送,只是在请求到达时服务器不马上进行响应,待有用数据处理完成后再进行response,简单测试了一下,没有进行超时设置(服务端,发送端均没设置,实际情况请自行斟酌)。至少服务器断睡1分钟是没有问题的

先上前端代码:

<!DOCTYPE html>
<html>
<head>
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<script type="text/javascript">
	$(function() {
		function connect(){
			var xhr = new XMLHttpRequest();
			xhr.open("POST", "do.jsp?num="+$("#Num").html(), true);
			function DoResult(){
				if(xhr.readyState == 4){
					$("#Num").html(xhr.responseText);
					connect();
				}
			}
			xhr.onreadystatechange = DoResult;
			xhr.send(null);
		}
		connect();
	})
</script>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div id="Num">
			7
		</div>
</body>
</html>
js内对connection方法进行貌似递归的调用,每次把当前页面div中的值传入后台do.jsp进行处理,成功返回后修改div中的值,再次携带当前div中的值发送ajax请求,为什么要携带当前值?因为后台如果判断前断值和后端值不一致时可以直接返回刷新页面而迅速同步前后端的值。没有对timeout或是failure的情况进行定义,可以自行斟酌添加。


下面是do.jsp:


<%@page import="com.ajax.Keeper"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%
String num = request.getParameter("num");
if(num==null)
	num = "0";
out.print(Keeper.getPrice(num));	
	

%>

很简单,直接上keeper类:keeper类模拟服务器端对一个静态值进行修改:start()方法,在修改后通知客户端进行同步 getPrice()方法。


package com.ajax;


public class Keeper {
	private static int  price = 100;
	private static final Object lock = new Object();
	static{
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					
					try {
						start();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}).start();
	}
	public static int getPrice(String last) throws InterruptedException{
		System.out.println(last);
		if(!last.equals(Integer.toString(price)))
			return price;
		synchronized(lock){
			lock.wait();
		}
		return price;
	}
	
	public static void start() throws InterruptedException{
		while(true){
			Thread.sleep(60000);
			price--;
			synchronized(lock){
				lock.notifyAll();
			}
		}
	}
}


当请求到达执行getPrice方法,多个请求对lock对象竞争,得到的进入代码块,然后wait()放弃锁。而减价线程对price进行修改,1M一次,并竞争lock对象释放lock对象waittingroom中的线程。由于notify与外部请求会同时竞争Lock对象,所以计时未必特别准确,但这个缺陷不影响服务器端和客户端的内容一直性,然后在多个线程在返回当前price时会对lock对象进行竞争,做不到完全的同时返回。究竟差多少能不能满足需求。还需要进一步的考量,还有一种做法是服务端getPrice方法内部进行循环并设置标志位,但效率恐怕是不会高,而且标志位如何控制,其实也十分困难。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在前端使用 Ajax 连接数据库是不安全的,因为数据库连接信息通常包含用户名、密码等敏感信息,暴露在前端容易导致安全风险。一般情况下,前端通过 Ajax 发送请求到后端,后端再与数据库进行交互。 你可以按照以下步骤使用 Ajax 连接数据库: 1. 在前端使用 JavaScript 编写 Ajax 请求,并指定后端处理该请求的 URL。 2. 在后端使用服务器端编程语言(如 PHP、Node.js 等)接收 Ajax 请求,并处理请求。 3. 在后端通过合适的方式(如数据库连接库)连接数据库,并执行相应的数据操作(增删改查)。 4. 后端处理完数据库操作后,将结果返回给前端。 以下是一个简单的示例: 前端代码(使用 jQuery 的 Ajax): ```javascript $.ajax({ url: 'backend.php', // 后端处理请求的URL type: 'POST', // 请求类型 data: {param1: value1, param2: value2}, // 发送给后端的数据 success: function(response) { // 处理后端返回的数据 console.log(response); }, error: function(xhr, status, error) { // 处理错误 console.error(error); } }); ``` 后端代码(使用 PHP 连接 MySQL 数据库): ```php <?php $servername = "localhost"; $username = "your_username"; $password = "your_password"; $dbname = "your_database"; // 创建数据库连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接是否成功 if ($conn->connect_error) { die("连接数据库失败: " . $conn->connect_error); } // 处理 Ajax 请求 // ... // 关闭数据库连接 $conn->close(); ?> ``` 需要注意的是,以上示例只是一个简单的演示,并没有包含完整的错误处理、安全性措施等。在实际项目中,需要根据具体情况进行更严谨的编码和防护措施。另外,不同的后端语言和数据库类型有不同的连接方式和操作方式,可以根据自己的需求选择合适的技术栈进行开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值