- 浏览: 324742 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
lst923:
...
java 实现图片裁剪 -
kakarottoz:
多谢博主分享,正好用到!
java 实现图片裁剪 -
Vcb:
http://osgi.jxtech.net 是一个完全基于O ...
OSGi介绍 -
Vcb:
是一个完全基于OSGi的开发平台,有在线演示,免费插件可供下 ...
OSGi介绍 -
mikey_5:
谢谢分享,原来设置: style="word-bre ...
td内容自动换行
WebIM开发技术细节
最近两年WebIM特别的流行,像淘宝的阿里旺旺网页版,腾讯的WEBQQ,Google的gtalk,百度hi等等都陆续推出了自己的网页版的聊天软件。实现网页的即时聊天,有一个关键的问题就是怎么样让服务器不停的往客户度发送数据,现在解决的方案一般是用:iframe 隐藏帧,flash的xmlsocket,或者使用ajax在请求未结束的时候马上发起请求。我个人觉得还是iframe的实现方式比较好,目前腾讯等都是用的iframe的方式,具体原因不解释。但是对于iframe如何传送数据是一个难点。突破这个难点一切就简单了。
我自己参考了一些博客资料以及国外的完整后自己测试终于把这个问题给解决了,要让服务端一直发送数据首先要利用chunked传输response。
下面列出我的实现代码:
XML/HTML代码1.<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
3.<html>
4. <head>
5. <title>Iframe数据</title>
6. <meta http-equiv="pragma" content="no-cache">
7. <meta http-equiv="cache-control" content="no-cache">
8. <meta http-equiv="expires" content="0">
9. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
10. </head>
11. <body>
12. 数据列表:<br/>
13. <div id="datalist" style="width:400px;height:300px;border:1px solid #EF0;overflow: auto;">
14.
15. </div>
16. <script type="text/javascript">
17. function getData(d){
18. $("#datalist").append(d);
19. }
20. function rpc_iframe() {
21. var transferDoc = new ActiveXObject("htmlfile");
22. transferDoc.open();
23. transferDoc.write("<html>")
24. transferDoc.write("<div><iframe src=\"IFrameStream.do\"></iframe></div>");
25. transferDoc.close("</html>");
26. transferDoc.parentWindow.getData = getData;
27. setInterval(function () { }, 10000); //不加这句会使连接断开
28. }
29. rpc_iframe();
30. </script>
31.
32. </body>
33.</html>
接下来是我们后台的代码:
Java代码1.package org.javafans.chat;
2.
3.import java.io.IOException;
4.import java.io.PrintWriter;
5.import java.text.SimpleDateFormat;
6.import java.util.Date;
7.
8.import javax.servlet.ServletException;
9.import javax.servlet.annotation.WebServlet;
10.import javax.servlet.http.HttpServlet;
11.import javax.servlet.http.HttpServletRequest;
12.import javax.servlet.http.HttpServletResponse;
13.
14.@WebServlet(urlPatterns="/IFrameStream.do")
15.public class IFrameStreamServlet extends HttpServlet{
16. /**
17. * @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么)
18. */
19. private static final long serialVersionUID = 1L;
20.
21. /* (non-Javadoc)
22. * <p>Title: doGet</p>
23. * <p>Description: </p>
24. * @param req
25. * @param resp
26. * @throws ServletException
27. * @throws IOException
28. * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
29. */
30. @Override
31. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
32. throws ServletException, IOException {
33. // TODO Auto-generated method stub
34. this.doPost(req, resp);
35. }
36.
37. /* (non-Javadoc)
38. * <p>Title: doPost</p>
39. * <p>Description: </p>
40. * @param req
41. * @param resp
42. * @throws ServletException
43. * @throws IOException
44. * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
45. */
46. @Override
47. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
48. throws ServletException, IOException {
49. // TODO Auto-generated method stub
50.
51. //需要实时生成消息长度,服务器一般使用chunked编码。
52. resp.setHeader("transfer-coding", "chunked");
53. resp.setContentType("text/html;charset=utf8");
54. PrintWriter out = resp.getWriter();
55.
56. String startHTML = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n";
57. startHTML += "<html xmlns=\"http://www.w3.org/1999/xhtml\" >\r\n" ;
58. startHTML += "<head>\r\n</head>\r\n" ;
59. startHTML += "<body>\r\n" ;
60.
61. out.write(startHTML);
62. out.flush();
63.
64. String data = "<script type=\"text/javascript\">parent.getData(\"%s\");</script>";
65.
66. out.write(String.format(data, "开始发送数据<br/>"));
67. out.flush();
68. while(true){
69. try {
70. Thread.sleep(1000);
71. } catch (InterruptedException e) {
72. e.printStackTrace();
73. }
74. out.append(String.format(data,"服务端发送的数据"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"<br/>"));
75. out.flush();
76. }
77.
78.
79. }
80.
81.
82.
83.}
最近两年WebIM特别的流行,像淘宝的阿里旺旺网页版,腾讯的WEBQQ,Google的gtalk,百度hi等等都陆续推出了自己的网页版的聊天软件。实现网页的即时聊天,有一个关键的问题就是怎么样让服务器不停的往客户度发送数据,现在解决的方案一般是用:iframe 隐藏帧,flash的xmlsocket,或者使用ajax在请求未结束的时候马上发起请求。我个人觉得还是iframe的实现方式比较好,目前腾讯等都是用的iframe的方式,具体原因不解释。但是对于iframe如何传送数据是一个难点。突破这个难点一切就简单了。
我自己参考了一些博客资料以及国外的完整后自己测试终于把这个问题给解决了,要让服务端一直发送数据首先要利用chunked传输response。
下面列出我的实现代码:
XML/HTML代码1.<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
3.<html>
4. <head>
5. <title>Iframe数据</title>
6. <meta http-equiv="pragma" content="no-cache">
7. <meta http-equiv="cache-control" content="no-cache">
8. <meta http-equiv="expires" content="0">
9. <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
10. </head>
11. <body>
12. 数据列表:<br/>
13. <div id="datalist" style="width:400px;height:300px;border:1px solid #EF0;overflow: auto;">
14.
15. </div>
16. <script type="text/javascript">
17. function getData(d){
18. $("#datalist").append(d);
19. }
20. function rpc_iframe() {
21. var transferDoc = new ActiveXObject("htmlfile");
22. transferDoc.open();
23. transferDoc.write("<html>")
24. transferDoc.write("<div><iframe src=\"IFrameStream.do\"></iframe></div>");
25. transferDoc.close("</html>");
26. transferDoc.parentWindow.getData = getData;
27. setInterval(function () { }, 10000); //不加这句会使连接断开
28. }
29. rpc_iframe();
30. </script>
31.
32. </body>
33.</html>
接下来是我们后台的代码:
Java代码1.package org.javafans.chat;
2.
3.import java.io.IOException;
4.import java.io.PrintWriter;
5.import java.text.SimpleDateFormat;
6.import java.util.Date;
7.
8.import javax.servlet.ServletException;
9.import javax.servlet.annotation.WebServlet;
10.import javax.servlet.http.HttpServlet;
11.import javax.servlet.http.HttpServletRequest;
12.import javax.servlet.http.HttpServletResponse;
13.
14.@WebServlet(urlPatterns="/IFrameStream.do")
15.public class IFrameStreamServlet extends HttpServlet{
16. /**
17. * @Fields serialVersionUID : TODO(用一句话描述这个变量表示什么)
18. */
19. private static final long serialVersionUID = 1L;
20.
21. /* (non-Javadoc)
22. * <p>Title: doGet</p>
23. * <p>Description: </p>
24. * @param req
25. * @param resp
26. * @throws ServletException
27. * @throws IOException
28. * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
29. */
30. @Override
31. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
32. throws ServletException, IOException {
33. // TODO Auto-generated method stub
34. this.doPost(req, resp);
35. }
36.
37. /* (non-Javadoc)
38. * <p>Title: doPost</p>
39. * <p>Description: </p>
40. * @param req
41. * @param resp
42. * @throws ServletException
43. * @throws IOException
44. * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
45. */
46. @Override
47. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
48. throws ServletException, IOException {
49. // TODO Auto-generated method stub
50.
51. //需要实时生成消息长度,服务器一般使用chunked编码。
52. resp.setHeader("transfer-coding", "chunked");
53. resp.setContentType("text/html;charset=utf8");
54. PrintWriter out = resp.getWriter();
55.
56. String startHTML = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n";
57. startHTML += "<html xmlns=\"http://www.w3.org/1999/xhtml\" >\r\n" ;
58. startHTML += "<head>\r\n</head>\r\n" ;
59. startHTML += "<body>\r\n" ;
60.
61. out.write(startHTML);
62. out.flush();
63.
64. String data = "<script type=\"text/javascript\">parent.getData(\"%s\");</script>";
65.
66. out.write(String.format(data, "开始发送数据<br/>"));
67. out.flush();
68. while(true){
69. try {
70. Thread.sleep(1000);
71. } catch (InterruptedException e) {
72. e.printStackTrace();
73. }
74. out.append(String.format(data,"服务端发送的数据"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"<br/>"));
75. out.flush();
76. }
77.
78.
79. }
80.
81.
82.
83.}
发表评论
-
hibernate集合映射inverse和cascade详解
2013-05-04 12:14 964网上转载,出处不详 1、到底在哪用cascade=" ... -
js取el中的map值及js replaceAll实现
2013-04-10 15:55 2290<% Map map = new HashMap(); ... -
Struts2返回结果类型
2013-04-03 15:35 978转自:http://blog.csdn.net/sleepin ... -
Hibernate实体注解
2013-04-03 15:29 1133转自:http://blog.csdn.net/sleepin ... -
dom事件与setTimeout
2013-03-15 15:11 1485<html> <head> ... -
js数组操作
2013-03-12 14:06 1123原文: http://www.blogjava.net/zks ... -
eclipse jee + tomcat记要
2013-03-08 15:37 2784今天重新下了个eclipse-jee-helios-SR2-w ... -
Hibernate主键生成策略
2013-01-28 15:50 8731) assigned 主键由外部程 ... -
tomcat调整内存大小
2012-11-14 14:15 1016Tomcat6使用安装版本进行安装后,使用内存的调整无法利用修 ... -
jstl与 jsp脚本间的数据传递
2012-11-08 13:34 1054可能这个标题没有确切表达我的意思,直接说用处 后台把一个对象, ... -
iframe 框架自适应高度
2012-11-07 17:33 12701. 经典代码 iFrame 自适应高度,在IE6/IE7/I ... -
spring RMI rmoting远程服务实例
2012-10-25 14:39 1397还没有测试,先留在这儿,转自http://www.walker ... -
web前端学习资源
2012-10-19 09:11 1071CSS彻底研究视频教程(全23讲) 本套视频教程配合《CSS ... -
JS字符串函数
2012-09-11 14:31 851http://www.cnblogs.com/qfb620/a ... -
javascript 20种小技巧
2012-08-16 16:59 994原文地址: http://www.iiwn ... -
hibernate条件查询
2012-08-15 10:43 12581. Criteria criteria = getSessi ... -
一个分号引发的"血案"
2012-08-14 16:29 1228我用hibernate的SQLQuery做查询,sql是拼出来 ... -
struts 文件下载
2012-07-19 11:17 924以下代码是struts1中的action中 一般下载有三种方式 ... -
struts1 forward 请求带参数
2012-07-18 10:40 1830如果action配置中,加了scope="reque ... -
struts1 初始化
2012-07-18 10:08 1498好久不用这了,现在项目用到,回忆下struts1的基础 一 ...
相关推荐
WebIM,全称为Web即时通讯,是一种基于Web技术实现的在线聊天系统,它允许用户在浏览器中进行实时的文本、语音甚至视频通信,无需安装额外的客户端软件。WebIM的核心是利用WebSocket等现代网络通信协议,提供低延迟...
"WEBIM"(Web即时通讯)技术就是实现这种实时通信的关键工具。本文将深入探讨WEBIM在网站开发中的用途,以及如何利用Sample.Client.rar这个压缩包资源进行实践。 **WEBIM的定义与工作原理** WEBIM,全称为Web ...
【PHPWebIM网页即时聊天工具 v1.0.zip】是一个基于PHP开发的在线实时通信系统,主要用于实现网页上的即时消息传递。这个工具可能是为了解决网站用户之间或者用户与客服之间的沟通需求,使得无需离开网站就能进行顺畅...
【标题】:“openfire+smack开发webim笔记”涉及的知识点详解 【一】XMPP(可扩展消息处理现场协议) XMPP是一种基于XML的即时通讯协议,它最初源于Jabber项目,用于实现服务器之间的即时消息传递和在线状态探测。...
WebIM(Web即时通讯)是一种基于网页的实时通信技术,它允许用户在浏览器上实现即时消息的发送和接收,无需安装额外的客户端软件。WebIM技术通常基于WebSocket、Long Polling、Server-Sent Events等现代浏览器支持的...
WebIM的出现,为开发者提供了一种便捷的方式来集成这种功能到自己的网站或系统中。 1. **WebIM架构与原理** WebIM基于WebSocket协议,这是一种在浏览器和服务器之间建立长连接的协议,克服了HTTP协议的限制,实现...
WebIM-for-记事狗插件是为记事狗微博社区开发的站内即时消息系统,实现记事狗微博社区好友间的即时聊天。 NexTalk采用跨域WebSocket或JSONP,有效避免了Webim对社区站点本身资源占用,以支持大规模的同时在线用户。 ...
本 WebIM 系统采用 B/S 模式,使用浏览器 ajax 实现即时聊天。 服务器端采用 MC 设计模式,Controler 分为组包拆包模块(编码子模块、加密解密子模块、序列化/反序列化子模块)和主处理模块(包含:Manager、DAO);...
【标题】"WebIM for ThinkPHP" WebIM(Web即时通讯)是一种在网页上实现即时通信功能的技术,常用于在线客服、社交应用等场景。它允许用户无需安装额外软件即可在浏览器中进行实时对话。本项目是WebIM的ThinkPHP...
WebIM(Web即时通讯)是一种基于网页的即时通信技术,它允许用户在浏览器上进行实时的文本、语音、视频聊天,无需安装额外的客户端软件。实现WebIM的关键技术之一是Ajax(Asynchronous JavaScript and XML),它是一...
1. **WebIM**:WebIM是一种基于Web的即时通讯系统,允许用户在浏览器内进行实时聊天,无需安装额外的客户端软件。它通常依赖于WebSocket等技术来实现双向、低延迟的数据传输。 2. **Java Pushlet**:Pushlet是Java...
这个“在线聊天WEBIM.rar”压缩包很可能包含了构建一个WebIM系统的相关资源和代码。 在WebIM系统中,主要涉及以下几个关键知识点: 1. **WebSocket协议**:WebSocket是HTML5引入的一种低延迟、双向通信协议,它为...
WebIM是一种基于Web技术的即时通讯(Instant Messaging)系统,主要应用于网页聊天功能。它允许用户在网页上实现实时的文本、语音甚至视频通信,无需安装额外的应用程序,只需通过浏览器即可进行交互。WebIM的核心是...
本项目是基于环信WebIM和LayIM这两款强大的前端即时通讯框架实现的网页在线聊天功能,旨在提供一个学习和实践的平台。 ### 1. 环信WebIM 环信WebIM是环信公司推出的一款专门针对Web端的即时通讯SDK,它提供了丰富...
鱼鱼WEBIM 2008-2010 aspdll版 要正常运行程序,请注册组件。 作者QQ:260332019 更新: 1、发消息页面、添加应用页面可以复制张贴等 2、增加了修改应用 3、突出鱼鱼应用,欢迎大家开发出鱼鱼的小应用程序。 ...
【标题】"webim-for-flask-master"是一个基于Flask框架构建的实时通讯系统项目,主要专注于实现Web即时通讯(WebIM)功能。这个项目利用Python的Flask库,为Web应用提供了一个轻量级、高效的实时通信解决方案。 ...
本 WebIM 系统采用 B/S 模式,使用浏览器 ajax 实现即时聊天。 服务器端采用 MC 设计模式,Controler 分为组包拆包模块(编码子模块、加密解密子模块、序列化/反序列化子模块)和主处理模块(包含:Manager、DAO);...
WebIM说明 WebIM是一款基于jQuery的一款web即时通讯插件,姑且这么称呼吧。插件最大程度实现了IM的常用功能,除即时通讯的常用功能外,还加入了:消息盒子、窗口抖动、添加删除好友、最近联系人、超时登录界面、...
在线客服服务支持系统WebIM163是一款专为网站提供实时交流功能的解决方案,它能够帮助企业或组织构建高效、便捷的在线客户服务系统。通过这款系统,访客可以在网站上直接与客服人员进行实时对话,提高客户满意度并...