`

Arch-03-06-仿 facebook 底条实现聊天功能

阅读更多

facebook 很火,那条能聊天的底部工具条更惹眼,似乎也容易抄袭,好象还很受用,决定抄一把。

 

(1)基础框架就选 DWR,为什么,因为我讨厌写太多 JS 脚本。还有更重要的原因是 DWR3 支持多种 WEB 容器的  comet 特性。我喜欢这句话“Asynchronous servlet support for Tomcat and Glassfish”。

 

那么多的 web 容器,每个都有自己的 Comet 长连接实现,自己去实现每个容器的特殊接口,不如交给 dwr 去搞定。

 

从零开始写也是不可能的,幸好 dwr.war 的包中已经有了个基础的聊天 demo,所以功能上是不成问题。

 

(2)外观要长得象  facebook 的底条,开源的一两个,拼凑一下。

        -http://www.sohtanaka.com/web-design/examples/footer-panel/

 

        -http://anantgarg.com/2009/05/13/gmail-facebook-style-jquery-chat/

        -http://www.cometchat.com/ 这个抄得神似一些,可惜需要美刀。


(3)只是长得象觉得对不住用户,还得有点内函才行,数据库也要顶一下。

(4)如果能配上代码,就完美许多了。coming soon.

(5)还是直接拿来用比较好,这个站点几乎是最佳了,极力推荐一下下:http://code.google.com/p/ijab/

======================================================================

选择 ijab , 接下来是集成 ijab 的功能了。

一般来说,拥有注册用户的网站都有自己的用户和群组,无需要再另外注册和管理了,后台 xmpp 服务器首选 OpenFire,如何无缝集成 OpenFire+iJab+自己网站会员管理?

(1)OpenFire + iJab 比较容易, http://code.google.com/p/ijab/wiki/iJabWithOpenfire

(2)搞了许久才测试成功,版本的选择很重要

        . Openfire3.6.4

        . iJab1.03

        . 主系统页面和 http-bind 必须相同域名,有两种方法一是用 apache 代理,二是在 tomcat Web应用中加入代理 servlet,都测试通过

(3)apache 代理

<VirtualHost 192.168.1.100:80>
	ServerAdmin webmaster@plusweb.com
	DocumentRoot /D/WORK/SAND/JAVA/workspace/sns/ijab
	<Directory /D/WORK/SAND/JAVA/workspace/sns/ijab>
    Options +Indexes +Multiviews
  </Directory>
  ServerName ideall01.gicp.net
	AddDefaultCharset UTF-8
  RewriteEngine on
  RewriteRule http-bind/ http://localhost:7070/http-bind/ [P]
</VirtualHost>
AddDefaultCharset UTF-8
Options +MultiViews
<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteRule http-bind/ http://localhost:7070/http-bind/ [P]
</IfModule>
 

    这个单独ijab可以使用,无法和我的应用集成一起。

 

(4)加入 servlet 的方法很好,我很喜欢。

 

     <servlet>
        <servlet-name>HttpBindServlet</servlet-name>
        <servlet-class>com.plus.openfire.servlet.ProxyServlet</servlet-class>
        <init-param>
            <param-name>url</param-name>
            <param-value>http://192.168.1.100:7070/http-bind/</param-value>
        </init-param>
    </servlet>

   <!--@@JSPC-SERVLETS@@-->

    <!-- Servlet mappings -->
    <servlet-mapping>
        <servlet-name>HttpBindServlet</servlet-name>
        <url-pattern>/http-bind/*</url-pattern>
    </servlet-mapping>

 

 

  以下代码来自于http://www.iteye.com/topic/520109

 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ProxyServlet extends HttpServlet {
	private String url;

	/**
	 * 对servlet进行请求处理,并将结果在指定输出流中输出
	 * 
	 * @param os
	 * @param servletName
	 * @param parm
	 * @throws IOException
	 * @throws MalformedURLException
	 */
	private void process(HttpServletRequest req, HttpServletResponse resp,
			String[] target) throws MalformedURLException, IOException {
		// 取得连接
		HttpURLConnection huc = (HttpURLConnection) new URL(url + target[0])
				.openConnection();

		// 设置连接属性
		huc.setDoOutput(true);
		huc.setRequestMethod("POST");
		huc.setUseCaches(false);
		huc.setInstanceFollowRedirects(true);
		huc.setRequestProperty("Content-Type",
				"application/x-www-form-urlencoded");
		huc.connect();

		// 往目标servlet中提供参数
		OutputStream targetOS = huc.getOutputStream();
		targetOS.write(target[1].getBytes());
		targetOS.flush();
		targetOS.close();

		// 取得页面输出,并设置页面编码及缓存设置
		resp.setContentType(huc.getContentType());
		resp.setHeader("Cache-Control", huc.getHeaderField("Cache-Control"));
		resp.setHeader("Pragma", huc.getHeaderField("Pragma"));
		resp.setHeader("Expires", huc.getHeaderField("Expires"));
		OutputStream os = resp.getOutputStream();

		// 将目标servlet的输入流直接往页面输出
		InputStream targetIS = huc.getInputStream();
		int r;
		while ((r = targetIS.read()) != -1) {
			os.write(r);
		}
		targetIS.close();
		os.flush();
		os.close();

		huc.disconnect();
	}

	/**
	 * 将参数中的目标分离成由目标servlet名称和参数组成的数组
	 * 
	 * @param queryString
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	private String[] parse(Map map) throws UnsupportedEncodingException {
		String[] arr = { "", "" };
		Iterator iter = map.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry me = (Entry) iter.next();
			String[] varr = (String[]) me.getValue();
			if ("servletName".equals(me.getKey())) {
				// 取出servlet名称
				arr[0] = varr[0];
			} else {
				// 重新组装参数字符串
				for (int i = 0; i < varr.length; i++) {
					// 参数需要进行转码,实现字符集的统一
					arr[1] += "&" + me.getKey() + "="
							+ URLEncoder.encode(varr[i], "utf-8");
				}
			}
		}
		arr[1] = arr[1].replaceAll("^&", "");
		return arr;
	}

	@Override
	public void init() throws ServletException {
		// 设置目标服务器地址
		url = this.getInitParameter("url");
		if (!url.endsWith("/"))
			url = url + "/";
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		this.doPost(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String[] target = parse(req.getParameterMap());
		process(req, resp, target);
	}
}
 

 

分享到:
评论

相关推荐

    Arch-Linux-Install-ScriptArch_Linux_安装脚本_Arch-Linux-Insta

    Arch-Linux-Install-ScriptArch_Linux_安装脚本_Arch-Linux-Installer

    Comcast-SP-NGOD-ASSET-ARCH-I03-100731-FINAL-Coship.pdf

    Next Generation On Demand (NGOD) Asset Architecture Comcast-SP-NGOD-ASSET-ARCH-I03-100731 Issued July 31, 2010

    cacti-plugin-arch-2.0.tar.gz

    "cacti-plugin-arch-2.0.tar.gz" 是一个针对Cacti的插件包,用于扩展Cacti的功能,提供更丰富的监控选项。此插件名为“Arch”,可能是对系统架构或性能分析相关的增强。 该压缩包文件的名称表明它是版本2.0,通常这...

    openrisc-arch-1.0-rev0

    OpenRISC是一种开源的指令集架构(ISA),它致力于提供一个简单、易于实现和使用的处理器核心,适用于广泛的嵌入式系统和应用程序。该文档是关于OpenRISC1000架构的手册,版本号为1.0,修订号为0,发布日期为2012年...

    Arch-03-08-热敏打印机集成方法

    标题“Arch-03-08-热敏打印机集成方法”指的是关于在计算机系统或应用程序中集成热敏打印机的技术过程。热敏打印机是一种利用热敏纸进行打印的设备,广泛应用于零售、餐饮和其他需要快速、小票打印的场景。集成热敏...

    apptoolkit-arch-core-common.jar

    基于android8.1源码平台中生成的jar,亲测可用!!!!

    变系数ARCH-M模型的ARCH效应检验

    变系数ARCH-M模型是时间序列分析领域的重要研究对象,其核心在于通过截面似然估计来检验模型是否具有条件异方差性(ARCH效应)。首先,我们来探讨一下条件异方差性的概念,它是指在时间序列分析中,随机变量的条件...

    UPnP-arch-DeviceArchitecture-v1.1.pdf

    UPnP(通用即插即用)技术是一种允许设备在家庭或...总而言之,通过《UPnP™ Device Architecture 1.1》文档,我们可以系统地掌握UPnP技术的基础知识和架构原理,并进一步探索如何在各种网络设备中实现和应用UPnP技术。

    Arch-03-15- Nginx+tomcat 配置负载均衡动静分离

    标题“Arch-03-15- Nginx+tomcat 配置负载均衡动静分离”涉及的是在Web服务器架构中使用Nginx与Tomcat的集成,通过配置实现负载均衡和动静态资源分离。这样的架构可以提高系统的可用性和响应速度,减轻后端应用...

    Processor Arch-Sequential

    本篇内容将深入探讨处理器架构中的顺序执行(Sequential Execution, SEQ)机制,包括其硬件结构、指令流、以及各执行阶段的具体功能。通过北京大学《计算机系统导论》第十讲提供的材料,本文旨在为读者提供一个全面...

    Python库 | arch-4.11-cp35-cp35m-win32.whl

    标题中的"Python库 | arch-4.11-cp35-cp35m-win32.whl"指的是一个特定版本的Python库,名为“arch”,版本为4.11,适用于Python 3.5解释器(由"cp35"标识),且是针对32位Windows操作系统("win32")的。"cp35m"表示...

    Comcast-SP-NGOD-GEN-ARCH-103-100731.pdf

    Next Generation On Demand (NGOD) Overall Architecture Comcast-SP-NGOD-GEN-ARCH-I03-100731 Issued July 31, 2010

    arch-snds100驱动程序

    总的来说,arch-snds100驱动程序是为s3c44b0x处理器定制的一个关键组件,它确保了系统对snds100设备的全面支持,提供了高效的数据交互和功能实现。通过深入理解驱动的工作原理和使用方法,开发人员可以更好地优化...

    Python库 | arch-4.8.0-cp27-cp27m-win32.whl

    python库。 资源全名:arch-4.8.0-cp27-cp27m-win32.whl

    Arch-03-24- Spring Security 应用

    NULL 博文链接:https://cnmqw.iteye.com/blog/1243596

    PyPI 官网下载 | arch-4.17-cp39-cp39-manylinux1_x86_64.whl

    资源来自pypi官网。 资源全名:arch-4.17-cp39-cp39-manylinux1_x86_64.whl

    UPnP-arch-DeviceArchitecture-v2.0

    总结来说,UPnP-arch-DeviceArchitecture-v2.0是一份详尽的UPnP协议开发指南,它不仅覆盖了UPnP协议的核心功能,还提供了网络设备开发的关键实现步骤。通过这份文件,开发者可以更深入地理解和掌握UPnP协议,从而在...

    PyPI 官网下载 | arch-4.9.1-cp36-cp36m-macosx_10_6_intel.whl

    资源来自pypi官网。 资源全名:arch-4.9.1-cp36-cp36m-macosx_10_6_intel.whl

    arch-openwrt-buildroot:基于 Arch Linux 的 OpenWrt buildroot docker 镜像

    安装克隆这个仓库git clone https://github.com/jannispinter/arch-openwrt-buildroot.git构建 docker 镜像 cd arch-openwrt-buildrootdocker build -t= " arch-openwrt-buildroot:trunk " . 最后的点表示Dockerfile...

    我的Arch_Linux安装步骤和日志_Arch-Linux-install-log.zip

    我的Arch_Linux安装步骤和日志_Arch-Linux-install-log

Global site tag (gtag.js) - Google Analytics