Ajax程序模拟SOCKET套接字编程
Ajax, 套接字, SOCKET, 程序, 模拟
在家无聊,重新看了下AJAX最底层的原理,因为不喜欢一直用被人封装了不知道几层的东西,所以就自己写了个不倚靠其他函数库的程序。并且用一个网页上的无刷新聊天室做例子来模拟SOCKET套接字编程。前台没的说,肯定用JavaScript。后台我用了自己熟悉的ASP.NET(C#)。其实于语言无关,各位可以用自己的解决方案轻松移植。(应该等能接受GET和POST请求吧,呵呵。我这是废话)
客户端核心代码。
<div id="divChatingDisplay"></div>做为实时显示聊天内容的区域
<p>
姓名:<input id="txtName" style="width: 100px" type="text" />说:
<input id="txtContent" type="text" style="width: 500px" />
<input id="Sender" type="button" value="发送" /></p>
一个简单的控制界面,这里不涉及用户身份验证系统。(史上最简陋的界面)
function createXMLHttpRequest()
{
if(window.ActiveXObject)
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if(window.XMLHttpRequest)
{
xmlHttp = new XMLHttpRequest()
}
}
构件一个XML形式的HTTP请求,默认大家用的都是IE浏览器(在中国最流行的一种)
function SendChatMessage()
{
createXMLHttpRequest();
var strName = txtName.value;
var strContent = txtContent.value;
var url = "bg_ChatInput.aspx";
var form = "name=" + strName + "&content=" + strContent;
xmlHttp.open("POST",url,true);
xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlHttp.send(form);
}
模拟浏览器发送POST的请求,在POST里写上各个需要传到服务器端的内容,发言的人和发言的内容。出于考虑到有些人可能话比较多,所以没有GET请求。POST传输的数据量最多达到4G,应该不会有那么话多人的,呵呵(真有一句话超过4GB的就踢了)。这里的bg_ChatInput.aspx是后台把聊天内容放进数据库的后台程序。下文会介绍它的实现方法。
function GetMessage()
{
createXMLHttpRequest();
var url = "bg_ChatGetInfo.aspx"
xmlHttp.onreadystatechange = handleStateChange;
xmlHttp.open("GET",url,true);
xmlHttp.send(null);
Refresh();
}
实时获得消息的函数,因为不涉及任何要传输的参数,所以用GET请求。bg_ChatGetInfo.aspx是后台一直获取消息的函数。处理收到的消息使用handleStateChange函数,这里用函数指针把.onreadystatechange 事件触发的函数指向handleStateChange。
function handleStateChange()
{
if(xmlHttp.readyState == 4)
{
if(xmlHttp.status == 200)
{
var content = xmlHttp.responseText;
divChatingDisplay.innerHTML=content;
}
else
{
window.alert("An error occurred: " + xmlHttp.statusText);
}
}
}
这里包含了一个简单的错误处理,详细情况可以参考一下关于微软的XMLHttpRequest对象的参考文档,这里没有什么处理,就是把接受到的数据简单得写入到divChatingDisplay中,并且以HTML格式。至此,我们的客户端还差一个定期查询更新内容的函数来模拟SOCKET中的监听线程。
function Refresh()
{
window.setTimeout("GetMessage()",1000);
}
在HTML头上添加<body>
我们注意,在刚刚的GetMessage函数最后套用了Refresh()函数,这样每1000毫秒都会执行一次GetMessage()函数,就模仿了SOCKET中的监听线程所做的工作,这样可以每次都能收到最新消息(这样放在另一个函数,而不是放在GetMessage函数里是让页面载入1秒后才开始获取信息,让界面充分载入后再加载数据,看上去比较高级哈.别把界面弄得太复杂,否则就看不出效果了)。这是客户端最需要注意的技巧。接下来我们完成了客户端所有的开发工作。
服务器端开发
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
string strName = Request.Form["name"].ToString();
string strContent = Request.Form["content"].ToString();
string strTime = DateTime.Now.ToString("T");
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + AppDomain.CurrentDomain.BaseDirectory + @"App_Data/db_InfoExchange.mdb";
string strSql = string.Format("INSERT INTO [tb_Chat] ([sender],[content],[time]) VALUES ('{0}','{1}','{2}')",strName,strContent,strTime);
OleDbConnection conn = new OleDbConnection(connString);
OleDbCommand cmd = new OleDbCommand(strSql, conn);
conn.Open();
int res = cmd.ExecuteNonQuery();
conn.Close();
}
</script>
一个很粗糙的ASP.NET程序,不需要任何界面.选用ACCESS做数据库,数据库设计也不介绍了.收到POST请求后获取name和content两个数据项后生成一个insert语句。添加到数据库中,注意我们接受刚刚用JavaScript模拟出来的POST请求。bg_ChatInput.aspx完成。
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
public int count = 0;
protected void Page_Load(object sender, EventArgs e)
{
Response.AddHeader("Cache-control", "No-cache");
Response.AddHeader("Pragma", "No-cache");
string connString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + AppDomain.CurrentDomain.BaseDirectory + @"App_Data/db_InfoExchange.mdb";
string strSql = "SELECT * FROM [tb_Chat]";
OleDbConnection conn = new OleDbConnection(connString);
OleDbCommand cmd = new OleDbCommand(strSql, conn);
OleDbDataReader reader;
conn.Open();
reader = cmd.ExecuteReader();
while (reader.Read())
{
Response.Write("<p><font size=2>"+reader["sender"].ToString() + " 说:" + reader["content"].ToString() + "</font></p>");
count++;
}
reader.Close();
if (count >= 10)
{
string sqlDelete = "DELETE FROM [tb_Chat]";
OleDbCommand cmdDelete = new OleDbCommand(sqlDelete, conn);
int redDelete = cmdDelete.ExecuteNonQuery();
}
conn.Close();
}
</script>
这里需要特别注意的是一个烦恼了我很长时间的问题,虽然我每次都有新的请求发向服务器,但客户端并没有每次都更新数据,经过我发疯一样得寻找原因发现原来是浏览器太高级了,习惯从缓存中获取数据。(避免频繁得向服务器要信息,再成堵塞.可我要的就是这个效果呀)为了每次都确保它能从服务器获取新的更新过的数据,必须要在文件前追加两个语句:
Response.AddHeader("Cache-control", "No-cache");
Response.AddHeader("Pragma", "No-cache");
不同的后台程序都不一样,大家可以自己查看自己语言的写法,每个后台都有类似的功能。(具体怎么回事情,大家可以翻HTTP协议的原始定义)
接着要说明的是,每次获取更新请求后(每个用户都会每阁1秒发一次请求)都从数据库里获取信息,并追加修饰,确定字体大小,颜色等等,因为客户端的数据处理只是简单得写入DIV中,所以一切按照HTML标准就可以了。这里为了防止大量的历史数据,每增加10条就会把数据库清空,我承认这不是一个很好的用户体验。但ACCESS数据库的支持实在不怎么样。诸如:
Delete top(1) from tb_Chat
的SQL语句是不支持的,所以只能一古脑都删干净咯,如果你使用其他格式的数据库就会解决这个问题。
至次,模拟了SOCKET套接字编程。一来一去都有,而且实时更新数据,模拟了监听进程。这一切都被很好的保护着。用户不会感到一丝的不自然,整个页面没有任何频闪,只有别人聊天记录被刷新,而且没有帕塔帕塔的刷新的声音,很安静,很智能。(像是某洗衣机的广告词,呵呵)。给志同道合的朋友们做个交流,呵呵。
相关推荐
手把手教你用Matlab搞定GRACE RL06数据读取:冯伟老师工具箱无GUI版实战
本文详细介绍了如何使用Matlab处理GRACE RL06数据,重点解析了冯伟教授工具箱的无GUI版实战操作。通过环境配置、核心函数改造和批处理技巧,帮助科研工作者高效完成重力场数据的读取与分析,特别适合服务器集群环境下的批量处理需求。
HTTP协议:socket处理ajax请求?
本文的主要内容是:使用socket(TCP连接)实现HTTP协议并充当服务端,对ajax的HTTP请求进行处理。
利用HTML+CSS设计PPT:html-to-pptx实现自动化转换与可编辑输出
在办公自动化和前端开发领域,将网页技术应用于文档生成是一个重要的技术方向。其核心原理在于通过解析HTML/CSS的结构与样式,将其映射为目标文档的原生对象模型。这项技术的价值在于,它能够将Web技术栈强大的布局与样式能力(如Flexbox、CSS Grid)与办公软件(如Microsoft PowerPoint)的广泛兼容性和可编辑性相结合。在实际应用场景中,这种技术特别适合需要快速生成兼具设计感与实用性的演示文稿,例如数据报告、产品发布和营销材料。本文探讨的html-to-pptx项目正是这一思路的工程实
Ajax与Socket多线程通信
软件层面的网络通信低层均有Socket实现,这里尝试使用Ajax与Socket进行通讯。 出于简化,省略掉了IO流和Socket的关闭。 页面设计 页面设计了两个按钮,通过ajax以post方式向端口发送消息,消息内容分别为action A和action B,便于接收端区分。 <!DOCTYPE html> <html> <head> <titl...
Apache Doris集群IP变更急救指南:用Docker容器+priority_networks快速恢复FE/BE节点
本文详细介绍了Apache Doris集群在IP变更情况下的应急处理方案,通过Docker容器和priority_networks配置快速恢复FE/BE节点。文章提供了从容器化环境构建、元数据迁移到生产环境切换的全流程指南,帮助运维团队在30分钟内完成集群恢复,显著减少停机时间。
【Android】汽车电源管理:深入解析CarPowerManager与Suspend To RAM的交互机制
本文深入解析了Android Automotive OS中CarPowerManager与Suspend To RAM(深度睡眠)的交互机制。详细阐述了从车辆发出睡眠请求,到CarPowerManagementService协调应用状态,最终通过内核进入低功耗睡眠的完整流程,并探讨了唤醒机制、开发者实践及功耗优化策略,为车机应用开发与系统优化提供关键指导。
JavaWeb~ajax跨域问题/socket构造请求/Https协议/非对称加密流程/证书机制
文章目录解决jax跨域问题socket构造http请求HTTPS传输过程 解决jax跨域问题 如下代码,我们使用ajax发起一个http请求。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <script src="https://cdn.b
AgentScope深入分析-ReActAgent
ReActAgent 是 AgentScope 框架中最核心的智能体实现,它完美诠释了"推理-行动"(Reasoning-Acting)循环的精髓。本文将深入分析 ReActAgent 的类继承关系、核心执行流程,以及状态管理、钩子机制、实时介入等关键技术点。通过阅读本文,你会理解智能体如何与模型交互、如何执行工具、如何处理中断,以及这些机制背后的设计考量。模块化:通过组合不同的组件(模型、格式化器、工具集、记忆)来构建智能体透明性:所有关键流程都对开发者可见,可以精确控制可扩展性。
封装WebSocket消息推送,干翻Ajax轮询方式
大厂技术高级前端Node进阶 点击上方程序员成长指北,关注公众号 回复1,加入高级Node交流群使用AJAX和WebSocket都可以实现消息推送,但它们在实现方式和适用场景上有所不同。下面是使用这两种技术实现消息推送的简要说明。AJax实现或WebSocket实现对比AJAX 实现消息推送AJAX(Asynchronous JavaScript and XML)允许你在不重新加载整个页...
作为专家系统与应用的审稿人:提醒你投稿注意事项
本文为《专家系统与应用》(ESWA)期刊投稿指南,重点强调研究方向匹配性、学术质量和写作规范。要求论文以智能系统/算法为核心,突出增量创新并具可验证性,需包含严谨方法论和充分实验验证。写作需结构清晰,符合期刊格式要求,包括明确的研究问题、分类文献综述、详细技术实现和量化结果。投稿前需仔细核对期刊指南,引用相关文献,并妥善处理审稿意见。ESWA注重创新实质性和应用落地价值,建议突出智能系统设计核心,避免成为单纯技术应用描述。
pip install安装markitdown时出现ERROR: ‘packages/markitdown[all]‘ is not a valid editable requirement解决方案
本文主要介绍了pip install安装markitdown时出现ERROR: ‘packages/markitdown[all]’ is not a valid editable requirement解决方案,希望能对使用markitdown的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案
前后端常用通讯方式-- ajax 、websocket
要这样完成一个WebSocket服务器,估计所有的人都想放弃,幸好的是市场上有几款比较好的开源库供我们使用,比如 PyWebSocket,WebSocket-Node, LibWebSockets等等,这些库文件已经实现了WebSocket数据包的封装和解析,我们可以调用这些接口,这在很大程度上减少了我们的工作量。另外,Socket.IO提供了4个配置的API:io.configure, io.set, io.enable, io.disable。//监听客户端连接,回调函数会传递本次连接的socket。
基于Python的虚拟货币社区情绪分析与市场价格预测爬虫实现
本文探讨了如何利用Python爬虫技术获取虚拟货币社区数据,并通过情感分析预测市场价格走势。我们将使用最新的异步爬虫框架、自然语言处理技术和机器学习模型,构建一个完整的社区情绪分析系统。本文提供了详细的代码实现和理论解释,适合作为毕业设计参考。关键词:Python爬虫、虚拟货币、情感分析、价格预测、异步爬虫、机器学习爬虫框架aiohttp和httpx用于异步HTTP请求HTML解析和parsel数据存储MongoDB和Pandas用于数据处理自然语言处理库和VADER情感分析工具机器学习和。
Web QQ 原理,ajax方式模拟socket编程
<br />技术参考文档:<br />http://www.javaeye.com/topic/28020<br />http://www.pushlets.com/<br />http://www.meebo.com/[成功案例]<br />更新请在搜索引擎里查找”服务器推技术”关键字<br />之前有写过一篇文章,是描述如何用轮询的方式实现用ajax方式模拟socket编程的。轮询有很多缺点。服务器的负载性能是最关键的问题。之后我有想过很多办法来实现。自己实现过一个http长连接的方式做的系统。实现很复
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
ajax模拟socket,用WebSocket模拟webQQ实现简单的聊天
1.使用WebSocket 的好处WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket使得服务器与客户端只需要一次握手就可以实现长久的连接,可以任意的传输多次数据直到自己断开连接,不用像别的协议一样传输完一次数据就断开连接,下次需要数据交互的时候在进行连接。减少了许多不必要的重复操作,提高效率。2.使用ajax轮询轮询(Polling)是...
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
使用PHP模拟ajax请求的源代码
我已经试过了,非常好用。/** * 构造ajax请求,不支持https */ function ajax_http_request($url, $data = array(), $type = "post", $params = array(), $accept = "", $ua = "", $referer = "", $file = false) { $http = strtolo
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
node.js+express+socket.io+jquery+ajax+bootstrap搭建一个聊天室
node.js+express+socket.io+jquery+ajax搭建一个聊天室
WebSocket入门介绍及编程实战
前言:最近看了几天的WebSocket,从以前的只闻其名,到现在也算是有一点点的了解了。所以就准备用博客记录一下自己的学习过程,希望也能帮助其它学习的人,因为我本人学习的过程中也是参考了很多其它人的博文。 这里主要是想了解一下WebSocket传输的协议帧,并使用java来模拟一个WebSocket客户端向服务端发送、接收数据。 注:对于网络协议的学习,通过自己编程实现一些简单的功能是一种很有效的方式。例如使用Socket去下载网络图片或者访问接口等,你会遇到很多问题,解决它们之后,也会收获很多东西! We
ajax 多人聊天吧,基于Nodejs利用socket.io实现多人聊天室
socket.io简介在Html5中存在着这样的一个新特性,引入了websocket,关于websocket的内部实现原理可以看这篇文章,这篇文章讲述了websocket无到有,根据协议,分析数据帧的头,进行构建websocket。虽然代码短,但可以很好地体现websocket的原理。,这个特性提供了浏览器端和服务器端的基于TCP连接的双向通道。但是并不是所有的浏览器都支持websocket特性,...
论Http、Socket、WebSocket、WebService(SOAP)之间的区别
点击上方“小码哥Damon”,选择“设为星标”回复“yeah”,获取礼包资料本场 Chat 旨在一分钟教你理解各种协议的区别。在本场 Chat 中,会讲到如下内容:- 什么是 Http...
WebSocket与Socket.io
认识HTML5的WebSocket 在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法有效地推动消息到服务器。让我们看一看HTML5的WebSocket API:它可用于客户端、服务器端。而且有一个优秀的第三方API,名
利用Ajax实现长连接(模拟推送,半长连接)
很多程序都可以通过socket来实现长连接,实现消息的即时推送。但由于http请求一般都是短连接,一次请求结束,就会断开与服务器的连接,服务器不能主动推送数据到客户端,而只能由客户端发起请求,但有些时候,需要在web上实现即时的消息传输,比如即时聊天、股票动态信息等。 在Ajax技术被发掘以前,在网页上实现无刷新的即时聊天,似乎是很困难的事情,但由于Ajax技术的兴起,人们可以进一步来挖掘...
socket 通信
WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议首先,客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
php socket 小程序,微信小程序: webSocket 应用
内容说明主要说一下微信小程序的websocket接口以及在小程序中的使用;webSocket 是什么?微信的websocket跟HTML5的websocket基本一致。都是HTTP协议升级来的,做为一个全新的Socket在B/S上使用,实现了服务器和浏览器的全双工通信。Websocket 于 AJAX的利弊在Websocket出来之前,都是通过AJAX来实现即时通信的。但是由于AJAX是采用轮循的...
php ajax 调用某个action,AJAX_ajax 怎么设置超时(一个action执行了2遍),今天在测试工程时发现一个acti - phpStudy...
ajax 怎么设置超时(一个action执行了2遍)今天在测试工程时发现一个action执行了2遍 ,这个操作大致需要5分多钟才能完成,工程环境 apache2+tomcat6.0。网上搜索发现了几个可以设置超时的地方:1.ajax 语法去设置单位毫秒,例如:$.ajax({url: XXX,timeout: 600000,type: 'POST',data: {},error: function...
php模拟referer,php HTTP_REFERER模仿代码
如果直接点击上面的链接,那么页面会显示referer页面的链接.代码如下:set http = createobject("msxml2.xmlhttp")http.open "get","http://www.phprm.com/test/referer.php",falsehttp.setrequestheader "referer","http://www.phprm.com"http.se...
200



被折叠的 条评论
为什么被折叠?



