`
jslfl
  • 浏览: 318867 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

WebIM

阅读更多
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

    WebIM,全称为Web即时通讯,是一种基于Web技术实现的在线聊天系统,它允许用户在浏览器中进行实时的文本、语音甚至视频通信,无需安装额外的客户端软件。WebIM的核心是利用WebSocket等现代网络通信协议,提供低延迟...

    WEBIM网站开发用途

    "WEBIM"(Web即时通讯)技术就是实现这种实时通信的关键工具。本文将深入探讨WEBIM在网站开发中的用途,以及如何利用Sample.Client.rar这个压缩包资源进行实践。 **WEBIM的定义与工作原理** WEBIM,全称为Web ...

    openfire+smack开发webim笔记

    【标题】:“openfire+smack开发webim笔记”涉及的知识点详解 【一】XMPP(可扩展消息处理现场协议) XMPP是一种基于XML的即时通讯协议,它最初源于Jabber项目,用于实现服务器之间的即时消息传递和在线状态探测。...

    webim(web即时通)学习文档

    WebIM(Web即时通讯)是一种基于网页的实时通信技术,它允许用户在浏览器上实现即时消息的发送和接收,无需安装额外的客户端软件。WebIM技术通常基于WebSocket、Long Polling、Server-Sent Events等现代浏览器支持的...

    webim,即时通信软件,php

    WebIM的出现,为开发者提供了一种便捷的方式来集成这种功能到自己的网站或系统中。 1. **WebIM架构与原理** WebIM基于WebSocket协议,这是一种在浏览器和服务器之间建立长连接的协议,克服了HTTP协议的限制,实现...

    Webim for 记事狗插件

    WebIM-for-记事狗插件是为记事狗微博社区开发的站内即时消息系统,实现记事狗微博社区好友间的即时聊天。 NexTalk采用跨域WebSocket或JSONP,有效避免了Webim对社区站点本身资源占用,以支持大规模的同时在线用户。 ...

    WebIM_Ajax框架

    本 WebIM 系统采用 B/S 模式,使用浏览器 ajax 实现即时聊天。 服务器端采用 MC 设计模式,Controler 分为组包拆包模块(编码子模块、加密解密子模块、序列化/反序列化子模块)和主处理模块(包含:Manager、DAO);...

    webim-for-thinkphp

    【标题】"WebIM for ThinkPHP" WebIM(Web即时通讯)是一种在网页上实现即时通信功能的技术,常用于在线客服、社交应用等场景。它允许用户无需安装额外软件即可在浏览器中进行实时对话。本项目是WebIM的ThinkPHP...

    实现webim得用ajax

    WebIM(Web即时通讯)是一种基于网页的即时通信技术,它允许用户在浏览器上进行实时的文本、语音、视频聊天,无需安装额外的客户端软件。实现WebIM的关键技术之一是Ajax(Asynchronous JavaScript and XML),它是一...

    免费下载WEBIM java pushlet .net php

    1. **WebIM**:WebIM是一种基于Web的即时通讯系统,允许用户在浏览器内进行实时聊天,无需安装额外的客户端软件。它通常依赖于WebSocket等技术来实现双向、低延迟的数据传输。 2. **Java Pushlet**:Pushlet是Java...

    在线聊天WEBIM.rar

    这个“在线聊天WEBIM.rar”压缩包很可能包含了构建一个WebIM系统的相关资源和代码。 在WebIM系统中,主要涉及以下几个关键知识点: 1. **WebSocket协议**:WebSocket是HTML5引入的一种低延迟、双向通信协议,它为...

    WebIM 即时通讯 网页聊天

    WebIM是一种基于Web技术的即时通讯(Instant Messaging)系统,主要应用于网页聊天功能。它允许用户在网页上实现实时的文本、语音甚至视频通信,无需安装额外的应用程序,只需通过浏览器即可进行交互。WebIM的核心是...

    基于环信webim+layim的网页即时通讯

    本项目是基于环信WebIM和LayIM这两款强大的前端即时通讯框架实现的网页在线聊天功能,旨在提供一个学习和实践的平台。 ### 1. 环信WebIM 环信WebIM是环信公司推出的一款专门针对Web端的即时通讯SDK,它提供了丰富...

    鱼鱼WEBIM 2008-2010

    鱼鱼WEBIM 2008-2010 aspdll版 要正常运行程序,请注册组件。 作者QQ:260332019 更新: 1、发消息页面、添加应用页面可以复制张贴等 2、增加了修改应用 3、突出鱼鱼应用,欢迎大家开发出鱼鱼的小应用程序。 ...

    webim-for-flask-master

    【标题】"webim-for-flask-master"是一个基于Flask框架构建的实时通讯系统项目,主要专注于实现Web即时通讯(WebIM)功能。这个项目利用Python的Flask库,为Web应用提供了一个轻量级、高效的实时通信解决方案。 ...

    基于AJAX的WebIM(ASP.NET + JQuery + AJAX)

    本 WebIM 系统采用 B/S 模式,使用浏览器 ajax 实现即时聊天。 服务器端采用 MC 设计模式,Controler 分为组包拆包模块(编码子模块、加密解密子模块、序列化/反序列化子模块)和主处理模块(包含:Manager、DAO);...

    在线客服服务支持系统webim163

    在线客服服务支持系统WebIM163是一款专为网站提供实时交流功能的解决方案,它能够帮助企业或组织构建高效、便捷的在线客户服务系统。通过这款系统,访客可以在网站上直接与客服人员进行实时对话,提高客户满意度并...

    WebIM-for-近乎SNS插件 v5.3

    WebIM-for-近乎SNS是为近乎SNS微博社区开发的站内即时消息系统,实现近乎SNS微博社区好友间的即时聊天。Nextalk是专为社区网站开发的即时消息系统NexTalk是专为社区网站(论坛/社区/微博)开发的简单,专业,开源的...

    java webIM 上传错了,现在换这个

    Java WebIM(Web即时通讯)是一种在Web应用中实现用户实时通信的技术,它允许用户通过浏览器进行聊天、文件传输等活动,极大地增强了Web应用的交互性和实时性。在本案例中,由于之前的上传出现问题,现在提供了新的...

Global site tag (gtag.js) - Google Analytics