转载自:http://vincent-yy.iteye.com/blog/427922
小型聊天室--DWR实现服务器推技术
当看到DWR2也可以实现推技术之后,想尝试一下!
首先当官方上下载一个dwr的jar文件和commons-logging-1.1.1.jar
先从配置文件入手
web.xml
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 以设置下格式固定,可复制使用 -->
<display-name>ajaxDWR</display-name>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<!--
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
-->
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<description>实现调试,在debug请设置为false</description>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>使用服务器推技术(反转AJAX)</description>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>
initApplicationScopeCreatorsAtStartup
</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>100</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
dwr.xml
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<!-- 对后台类的配置格式确定 -->
<allow>
<create creator="new" javascript="Chat">
<param name="class" value="com.dwr.chat.Chat" />
</create>
</allow>
</dwr>
编写好配置文件之后,开始编写页面,我们可以选择html或者jsp都可以
index3.html
Html代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index3.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type='text/javascript' src='dwr/util.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/interface/Chat.js'></script>
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<center>
<table width="600px" border="1">
<tr>
<td colspan="3" align="center">
XXXXXX Chat
</td>
<td>
User List
</td>
</tr>
<tr>
<td colspan="3" style="height: 300px">
<textarea rows="20" cols="60" readonly id="showmessage" name="showmessage"></textarea>
</td>
<td style="height: 300px" valign="top">
<div id="userlist" style="height:310px;overflow : scroll;"></div>
</td>
</tr>
<tr>
<td colspan="3" align="center">
<span id="say_name" ></span>
<textarea rows="3" cols="50" id="say_message" name="say_message"></textarea><input type="button" value="say" id="say" onclick="sayMessage()"/>
</td>
<td>
先录入你的昵称<br/>
<input type="text" style="width: 125px" name="name" id="name" />
<input type="button" value="确定" onclick="register()" />
</td>
</tr>
</table>
</center>
</body>
<script type="text/javascript">
dwr.engine.setActiveReverseAjax(true); // 激活反转 重要
init();
function init(){
document.getElementById('say_message').disabled = true;
document.getElementById('say').disabled = true;
}
function sayMessage(){
var message_content = DWRUtil.getValue('say_message');
var message_head = document.getElementById('say_name').innerHTML;
Chat.sayMessage(message_head+message_content);
document.getElementById('say_message').value = '';
}
function register() {
var name = DWRUtil.getValue("name");
Chat.addUser(name,callback);
}
function callback(str) {
if(str != ''){
alert(str);
}else{
document.getElementById('say_name').innerHTML = DWRUtil.getValue("name") + " 说:";
document.getElementById('say_message').disabled = false;
document.getElementById('say').disabled = false;
}
}
</script>
</html>
这个页面比较简陋,建议js写在下方,否则firefox会报错
Chat.java
Java代码
package com.dwr.chat;
import java.util.ArrayList;
import java.util.Collection;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.proxy.dwr.Util;
public class Chat {
static ArrayList<String> name_list = new ArrayList<String>();
static StringBuffer show_message = new StringBuffer();
public String addUser(String name,HttpServletRequest request) {
System.out.println("list.size() = "+name_list.size());
for (String s : name_list) {
if (name == null || name.trim().equals(s)) {
return "用户名已存在";
}
}
name_list.add(name.trim());
ServletContext sc = request.getSession().getServletContext();
ServerContext sctx = ServerContextFactory.get(sc);
Collection sessions = sctx.getScriptSessionsByPage("/dwr2Demo/index3.html");
Util util = new Util(sessions);
show_message.append("\n欢迎"+name+"来到 XXX Chat");
trimMessage();
util.setValue("showmessage", show_message.toString());
printUserList(util);
return "";
}
public void sayMessage(String message,HttpServletRequest request){
ServletContext sc = request.getSession().getServletContext();
ServerContext sctx = ServerContextFactory.get(sc);
Collection sessions = sctx.getScriptSessionsByPage("/dwr2Demo/index3.html");
Util util = new Util(sessions);
show_message.append("\n"+message);
trimMessage();
util.setValue("showmessage", show_message.toString());
printUserList(util);
}
public void trimMessage(){
if(show_message.length() > 2000){
show_message.delete(0, ((show_message.length() - 2000)*2+2));
}
}
public void printUserList(Util util){
StringBuffer userlist = new StringBuffer();
userlist.append("<table>");
for(String s : name_list){
userlist.append("<tr><td><font color='blue'>"+s+"</font></td></tr>");
}
userlist.append("</table>");
util.setValue("userlist", userlist.toString());
}
}
编写好这个之后,可以运行一下。
经过测试,发现几个问题 浏览器我现在测试了三种发现三种都有自己的特性
IE :比较正常,有时候会慢一些
firefox :每次刷新访问的时候服务器会出现一个异常
google浏览器:在刷新的时候会无限等待,一直到接收到信息
另一教程:http://hintcnuie.iteye.com/blog/175828
小型聊天室--DWR实现服务器推技术
当看到DWR2也可以实现推技术之后,想尝试一下!
首先当官方上下载一个dwr的jar文件和commons-logging-1.1.1.jar
先从配置文件入手
web.xml
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- 以设置下格式固定,可复制使用 -->
<display-name>ajaxDWR</display-name>
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<!--
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
-->
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<description>实现调试,在debug请设置为false</description>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<description>使用服务器推技术(反转AJAX)</description>
<param-name>activeReverseAjaxEnabled</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>
initApplicationScopeCreatorsAtStartup
</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>maxWaitAfterWrite</param-name>
<param-value>100</param-value>
</init-param>
<load-on-startup>4</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
</web-app>
dwr.xml
Xml代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<!-- 对后台类的配置格式确定 -->
<allow>
<create creator="new" javascript="Chat">
<param name="class" value="com.dwr.chat.Chat" />
</create>
</allow>
</dwr>
编写好配置文件之后,开始编写页面,我们可以选择html或者jsp都可以
index3.html
Html代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index3.html</title>
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type='text/javascript' src='dwr/util.js'></script>
<script type='text/javascript' src='dwr/engine.js'></script>
<script type='text/javascript' src='dwr/interface/Chat.js'></script>
<!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
</head>
<body>
<center>
<table width="600px" border="1">
<tr>
<td colspan="3" align="center">
XXXXXX Chat
</td>
<td>
User List
</td>
</tr>
<tr>
<td colspan="3" style="height: 300px">
<textarea rows="20" cols="60" readonly id="showmessage" name="showmessage"></textarea>
</td>
<td style="height: 300px" valign="top">
<div id="userlist" style="height:310px;overflow : scroll;"></div>
</td>
</tr>
<tr>
<td colspan="3" align="center">
<span id="say_name" ></span>
<textarea rows="3" cols="50" id="say_message" name="say_message"></textarea><input type="button" value="say" id="say" onclick="sayMessage()"/>
</td>
<td>
先录入你的昵称<br/>
<input type="text" style="width: 125px" name="name" id="name" />
<input type="button" value="确定" onclick="register()" />
</td>
</tr>
</table>
</center>
</body>
<script type="text/javascript">
dwr.engine.setActiveReverseAjax(true); // 激活反转 重要
init();
function init(){
document.getElementById('say_message').disabled = true;
document.getElementById('say').disabled = true;
}
function sayMessage(){
var message_content = DWRUtil.getValue('say_message');
var message_head = document.getElementById('say_name').innerHTML;
Chat.sayMessage(message_head+message_content);
document.getElementById('say_message').value = '';
}
function register() {
var name = DWRUtil.getValue("name");
Chat.addUser(name,callback);
}
function callback(str) {
if(str != ''){
alert(str);
}else{
document.getElementById('say_name').innerHTML = DWRUtil.getValue("name") + " 说:";
document.getElementById('say_message').disabled = false;
document.getElementById('say').disabled = false;
}
}
</script>
</html>
这个页面比较简陋,建议js写在下方,否则firefox会报错
Chat.java
Java代码
package com.dwr.chat;
import java.util.ArrayList;
import java.util.Collection;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.directwebremoting.ServerContext;
import org.directwebremoting.ServerContextFactory;
import org.directwebremoting.proxy.dwr.Util;
public class Chat {
static ArrayList<String> name_list = new ArrayList<String>();
static StringBuffer show_message = new StringBuffer();
public String addUser(String name,HttpServletRequest request) {
System.out.println("list.size() = "+name_list.size());
for (String s : name_list) {
if (name == null || name.trim().equals(s)) {
return "用户名已存在";
}
}
name_list.add(name.trim());
ServletContext sc = request.getSession().getServletContext();
ServerContext sctx = ServerContextFactory.get(sc);
Collection sessions = sctx.getScriptSessionsByPage("/dwr2Demo/index3.html");
Util util = new Util(sessions);
show_message.append("\n欢迎"+name+"来到 XXX Chat");
trimMessage();
util.setValue("showmessage", show_message.toString());
printUserList(util);
return "";
}
public void sayMessage(String message,HttpServletRequest request){
ServletContext sc = request.getSession().getServletContext();
ServerContext sctx = ServerContextFactory.get(sc);
Collection sessions = sctx.getScriptSessionsByPage("/dwr2Demo/index3.html");
Util util = new Util(sessions);
show_message.append("\n"+message);
trimMessage();
util.setValue("showmessage", show_message.toString());
printUserList(util);
}
public void trimMessage(){
if(show_message.length() > 2000){
show_message.delete(0, ((show_message.length() - 2000)*2+2));
}
}
public void printUserList(Util util){
StringBuffer userlist = new StringBuffer();
userlist.append("<table>");
for(String s : name_list){
userlist.append("<tr><td><font color='blue'>"+s+"</font></td></tr>");
}
userlist.append("</table>");
util.setValue("userlist", userlist.toString());
}
}
编写好这个之后,可以运行一下。
经过测试,发现几个问题 浏览器我现在测试了三种发现三种都有自己的特性
IE :比较正常,有时候会慢一些
firefox :每次刷新访问的时候服务器会出现一个异常
google浏览器:在刷新的时候会无限等待,一直到接收到信息
另一教程:http://hintcnuie.iteye.com/blog/175828
相关推荐
Java向苹果服务器推送消息是iOS应用开发者经常遇到的需求,用于实时通知用户新的信息或系统状态。APNs(Apple Push Notification service)是苹果公司提供的推送服务,允许开发者将消息推送到用户的iOS设备上。本...
在这个场景中,我们将探讨如何使用Java Applet来实现服务器推(Server-Side Push)技术,这是一个使得服务器能够主动向客户端发送数据而非等待客户端请求的机制,特别适用于实时性要求高的应用,如温度监控。...
基于MQTT的推送服务端在Java中的实现是一个常见需求,尤其在实时数据传输和设备通信场景中。本教程将深入探讨如何在Java中构建一个MQTT服务器,结合提供的描述和标签,我们将主要关注以下几个知识点: 1. **MQTT...
本项目源码展示了如何使用Java进行WebSocket的整合,从而实现服务器消息推送功能。以下将详细介绍WebSocket的核心概念、Java整合WebSocket的步骤以及在实际项目中的应用。 1. WebSocket简介: WebSocket协议是HTML5...
本篇文章将详细介绍如何在服务器端使用Java来实现iPhone的推送通知功能。 首先,我们需要了解APNs的工作原理。APNs是苹果公司的远程通知服务,当应用程序在后台或未运行时,可以通过APNs将消息推送到用户的设备上。...
JavaCV可以实现将接收到的视频流转换成RTMP格式并推送到这些服务器。 4. **FFmpeg**: FFmpeg是一个跨平台的命令行工具和库,用于处理多媒体数据,包括转码、封装、解码、播放等。在JavaCV中,FFmpeg库用于处理视频...
本项目聚焦于“基于Java的流媒体视频直播服务器设计与实现”,这涉及到多个IT领域的知识,包括音视频处理、服务器架构、Java编程以及运维等。 首先,我们要理解流媒体的概念。流媒体是指在互联网上传输的连续多媒体...
利用服务器推送技术实现站内短消息(java) 让client与service建立一个长连接,不用client手动request,service会自动response,当有好友在线的时候,会自动把好友的信息加载到select里,点击好友发送短消息时,会在...
JAVA整合WebSocket实现服务器消息推送(项目源码) (1)将Database文件夹中的扩展名为db_netExam_Data.MDF和db_netExam_Log.LDF的两个文件拷贝到SQL Server安装路径下的Data文件夹中。 (2)打开SQL Server 2005中的...
Java中的开源库如JMF(Java Media Framework)或VLCj可以用于实现RTSP推流,但现代的解决方案通常会使用更专业的库,如GStreamer或OBS Studio的Java绑定。不过,RTSP推流在现代直播系统中并不常见,因为RTMP(Real-...
1、项目需要,定时向所有在线用户推送一个广告或是推送一个通知之类的(比如服务器升级,请保存好手头工作之类的)。 2、相关环境 , Nginx、tomcat7、centos 6.5 3、项目框架,springMvc 4.0.6、layer
Java接入极光推送服务是移动应用开发者常用的一种技术,它允许开发者通过Java后端服务器向Android和iOS设备发送通知消息。极光推送(JPush)是中国知名的推送服务提供商,为开发者提供稳定、高效的推送解决方案。在...
### Java 实现上传文件到远程服务器(Spring MVC) 在现代软件开发中,文件上传功能是十分常见的需求之一,尤其在Web应用中。本篇文章将详细介绍如何利用Java编程语言结合Spring MVC框架来实现文件的远程上传功能。...
本文将详细介绍如何实现DWR的服务器推送功能。 一、DWR简介 DWR的核心功能是通过AJAX技术创建了一个JavaScript到Java的桥梁,使得开发者可以像操作本地对象一样操作远程服务器上的对象。它支持自动类型转换、错误...
这里,我们主要关注的几个核心知识点是:Java服务器的实现、Android客户端的开发以及Socket通信技术。 首先,Java服务器的实现通常涉及到网络编程,主要是通过Java的Socket库来创建服务器。`MyServer`这个文件很...
在这个"**dwr实现的服务器推demo**"中,我们看到一个实例,展示了如何利用DWR的技术来实现实时的、无需刷新的服务器推送功能。 服务器推是一种技术,它允许服务器主动地将数据发送到客户端,而不需要客户端(通常是...
Java 实现钉钉消息推送是一项常见的企业级应用需求,尤其在SpringBoot框架下,能够方便地集成各种服务。本文将详细讲解如何使用Java和SpringBoot来实现钉钉的消息推送功能,包括发送带有图片和链接的卡片消息。 ...
在IT行业中,构建一个基于Java服务器和Android客户端的聊天应用是一项常见的任务,它涉及到网络通信、数据传输以及多线程编程等多个技术领域。本项目利用Java作为后端服务器,Android作为前端客户端,通过Socket实现...
企业微信服务器会主动向应用服务器推送事件,如关注/取消关注、点击菜单等。开发者需要在指定的回调URL上接收并处理这些事件。 7. **错误处理** 调用API时,企业微信服务器会返回状态码和错误信息,需要正确处理...