- 浏览: 1325797 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (896)
- spring4 (14)
- hibernate3 (26)
- spring2 (35)
- struts2 (55)
- struts1 (15)
- 设计模式 (15)
- java (172)
- mybatis3 (11)
- sql (17)
- mysql (13)
- jbpm (10)
- J2EE (45)
- tools (29)
- js (83)
- 数据结构 (13)
- Html (26)
- web (22)
- flex (33)
- Oracle (57)
- linux (49)
- 算法 (6)
- 其它 (12)
- easyui (1)
- bootstrap (13)
- xml (2)
- tomcat (1)
- redis (10)
- activemq (2)
- webservice (11)
- maven (2)
- springboot (1)
- ubuntu (1)
- python (14)
- rocketmq (1)
- springcloud (10)
- opencv (1)
最新评论
-
mike_eclipse:
Hashtable是线程不安全的吗?好像是线程安全的吧?
多线程之集合类 -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
lodop打印控件 -
xingcxb:
经过测试,假的,依旧会出现中文乱码!!!!store方法里面采 ...
java 读写Properties文件,不会出现中文乱码 -
tiger20111989:
...
Spring注解方式管理事务 -
zw7534313:
...
js 文字上下滚动 无间断循环显示
这是个web聊天程序,很不错的,采用serverpush技术。
1.servlet(SpeakHouse.java 聊天室控制):
/**
* 聊天室程序
*/
public class SpeakHouse
extends HttpServlet {
/* 保存用户列表 */
static public ArrayList vecUserList = null;
/* 保存用户发言内容 */
static public ArrayList vecContentList = null;
/**
* 初始化类
*/
public SpeakHouse() {
if (vecUserList == null) {
vecUserList = new ArrayList();
vecUserList.add("所有人");
}
if (vecContentList == null) {
vecContentList = new ArrayList();
}
}
/**
* 初始化
*/
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
/**
* 清除
*/
public void destroy() {
super.destroy();
}
/**
* 控制程序
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
public void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
/* SystemUserInfo user=new SystemUserInfo(); //me
user.setUserName("test"+i++); //
request.getSession().setAttribute("session_UserInfo", user); //
*/
try {
PrintWriter out = new PrintWriter(response.getOutputStream());
setDefault(request, response);
/*请求的是哪个页面*/
//String strPage = ParamUtil.getParameter(request,"page");
String strPage=request.getParameter("page");
/* 显示主页面 */
if ("".equals(strPage) || strPage == null) {
showMainframe(out);
}
/* 显示发言内容 */
if ("ContentList".equals(strPage)) {
showDefault(out);
// showContentListframe(out,((SystemUserInfo)ContextUtil.getSessionObject(request,"session_UserInfo")).getUserName(),request,DateUtil.getNowTime());
showContentListframe(out,((SystemUserInfo)request.getSession().getAttribute("session_UserInfo")).getUserName(),request,DateUtil.getNowTime());
}
/* 显示用户列表 */
if ("UserList".equals(strPage)) {
showDefault(out);
showUserListframe(out);
}
if ("SpeakList".equals(strPage)) {
/* 保存发言内容 */
//String content = filter(ParamUtil.getParameter(request,"content"));
String content = filter(request.getParameter("content"));
//String isPrivate=ParamUtil.getParameter(request,"isPrivate");
String isPrivate=request.getParameter("isPrivate");
//String name=((SystemUserInfo)ContextUtil.getSessionObject(request,"session_UserInfo")).getUserName();
String name=((SystemUserInfo)request.getSession().getAttribute("session_UserInfo")).getUserName();
//聊的对象
//String toUser=filter(ParamUtil.getParameter(request,"toUser"));
String toUser=filter(request.getParameter("toUser"));
//是否退出聊天室
//String type=ParamUtil.getParameter(request,"type");
String type=request.getParameter("type");
if("exit".equals(type)){
UserSpeakContent closeSpeak=new UserSpeakContent();
if(vecUserList.indexOf(name)>0){
vecUserList.remove(name);
closeSpeak.setSpeakTime(DateUtil.getNowTime());
closeSpeak.setSpeakUser(name);
closeSpeak.setToSpeakUser("");
closeSpeak.setSpeakContent(name+"退出聊天室");
closeSpeak.setLogout(true);
closeSpeak.setSpeakType(1);
vecContentList.add(closeSpeak);
}
showDefault(out);
showSpeakListframe(out, name,closeSpeak.getToSpeakUser(),closeSpeak.isPrivate());
}else{
if("".equals(toUser)){
toUser="";
}
UserSpeakContent userSpeakContent=new UserSpeakContent();
/*表示刚刚进入聊天室*/
//if(!"".equals(name) && "".equals(content)){
if(name!=null && content==null){
userSpeakContent.setSpeakTime(DateUtil.getNowTime());
userSpeakContent.setSpeakUser("***系统信息***");
userSpeakContent.setToSpeakUser("所有人");
userSpeakContent.setSpeakContent(name+"刚刚进入聊天室");
userSpeakContent.setSpeakType(1);
}else{
if("私聊".equals(isPrivate)){
userSpeakContent.setPrivate(true);
}
userSpeakContent.setSpeakContent(content);
userSpeakContent.setSpeakTime(DateUtil.getNowTime());
userSpeakContent.setSpeakUser(name);
userSpeakContent.setToSpeakUser(toUser);
}
/*刚刚进入聊天室*/
//if(!"".equals(name) && "".equals(content)){
if(name!=null&&content==null){
if(vecUserList.indexOf(name)<0){ //在线用户中没有这个人
vecUserList.add(name);
}
}
if(vecUserList.indexOf(userSpeakContent.getSpeakUser())>0 && vecUserList.indexOf(userSpeakContent.getToSpeakUser())>0){ //说话人在线,聊天对象也在线
vecContentList.add(userSpeakContent);
}else if(vecUserList.indexOf(userSpeakContent.getSpeakUser())>0 && userSpeakContent.getToSpeakUser().equals("所有人")){ //说话人在线,聊天对象是所有人
vecContentList.add(userSpeakContent);
}else if(userSpeakContent.getSpeakType()==1){ //是系统信息
vecContentList.add(userSpeakContent);
}else if(vecUserList.indexOf(userSpeakContent.getSpeakUser())>0 && vecUserList.indexOf(userSpeakContent.getToSpeakUser())<0){ //说话人在线,聊天对象不在线
out.println("<script>alert('"+userSpeakContent.getToSpeakUser()+"已经下线!');</script>");
out.flush();
}
showDefault(out);
showSpeakListframe(out, name,userSpeakContent.getToSpeakUser(),userSpeakContent.isPrivate());
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 设页面初始参数
* @param request
* @param response
* @throws java.lang.Exception
*/
private void setDefault(HttpServletRequest request,
HttpServletResponse response) throws Exception {
response.setBufferSize(1024 * 64);
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache, must-revalidate");
response.setDateHeader("Expires", -1);
response.setContentType("text/html; charset=gbk");
request.setCharacterEncoding("GBK");
}
/**
* 输出页面头
* @param out
*/
private void showDefault(PrintWriter out) {
String[] strOut = new String[] {
"<html>",
"<head>",
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gbk\">",
"<title></title>",
"<!--",
"*************************",
"*************************",
"*************************",
"*************************",
"*************************",
"*************************",
"*************************",
"*************************",
"*************************",
"-->",
"<style type=\"text/css\">",
"<!--",
"body {overflow :auto; font-size: 9pt; background-color: #e0e0e0;}",
"-->",
"</style>",
"</head>",
"<script>window.status='聊天室';</script>",
"<body>"
};
for (int i = 0; i < strOut.length; i++) {
out.println(strOut[i]);
}
out.flush();
}
/**
* 显示主页面
* @param out
* @throws java.lang.Exception
*/
private void showMainframe(PrintWriter out) throws Exception {
String[] strOut = new String[] {
"<html>",
"<head>",
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gbk\">",
"<title>聊天室</title>",
"</head>",
"<frameset rows=\"*\" cols=\"100,*\" frameborder=\"YES\" border=\"1\" framespacing=\"0\">",
"<frame src=\"speakHouse?page=UserList\" name=\"UserListframe\" scrolling=\"NO\" noresize>",
"<frameset rows=\"*,70\" cols=\"*\" framespacing=\"0\" frameborder=\"YES\" border=\"1\">",
"<frame src=\"speakHouse?page=ContentList\" name=\"ContentListframe\">",
"<frame src=\"speakHouse?page=SpeakList\" name=\"SpeakListframe\" scrolling=\"NO\" noresize>",
"</frameset>",
"</frameset>",
"<noframes><body>",
"</body></noframes>",
"</html>",
};
for (int i = 0; i < strOut.length; i++) {
out.println(strOut[i]);
}
out.close();
}
/**
* 显示用户发言内容
* @param out
* @throws java.lang.Exception
*/
private void showContentListframe(PrintWriter out,String userName,HttpServletRequest request,Date logTime) {
int inListCount = 0;
int inUserList = 0;
UserSpeakContent userSpeakContent = null;
boolean isLogined=false;
boolean canLogout=false;
boolean isSpeak=false;
while (true) {
for(int i=vecContentList.size()-1;i>=0;i--){
userSpeakContent = (UserSpeakContent) vecContentList.get(i);
if(userSpeakContent.getSpeakUser().equals(userName)){
isSpeak=true;
//如果用户在线上,并且大余30分钟不发言,退出
if(vecUserList.indexOf(userName)>0 &&userSpeakContent.getSpeakType()==0){
if(DateUtil.getTwoTimeSub(DateUtil.getNowTime(),userSpeakContent.getSpeakTime())>=30){
//在线列表中删除userName这个人
vecUserList.remove(userName);
canLogout=true;
break;
}else{
break;
}
}else{
break;
}
}
}
if(isSpeak==false){
if(vecUserList.indexOf(userName)>0){
if(DateUtil.getTwoTimeSub(DateUtil.getNowTime(),logTime)>=30){
vecUserList.remove(userName);
canLogout=true;
}
}
isSpeak=true;
}
if (inListCount < vecContentList.size()) {
while (inListCount < vecContentList.size()) {
inListCount++;
userSpeakContent = (UserSpeakContent) vecContentList.get(inListCount - 1);
userSpeakContent= filterSelfMessage(userSpeakContent,userName);
if(userSpeakContent!=null){
//显示在登录前5分钟的信息
if(DateUtil.getTwoTimeSub(userSpeakContent.getSpeakTime(),logTime)>=-5){
if(userSpeakContent.getSpeakType()==1){ //系统信息
showSystemContent(out,userSpeakContent); //显示信息信息
}else{
if(userSpeakContent.getToSpeakUser().equals("所有人") && userSpeakContent.getSpeakUser().equals(userName)){
showSelfToAllContent(out,userSpeakContent);
}else if(userSpeakContent.getToSpeakUser().equals("所有人") && !userSpeakContent.getSpeakUser().equals(userName)){
showOtherToAllContent(out,userSpeakContent);
}else if(userSpeakContent.getSpeakUser().equals(userName) && userSpeakContent.getToSpeakUser().equals(userName)){//你对自己说的
if(userSpeakContent.isPrivate()){
showSelfToSelfContentPrivate(out,userSpeakContent); //自己对自己说悄悄话
}else{
showSelfToSelfContent(out,userSpeakContent); //自己对自己说
}
}else if(userSpeakContent.getSpeakUser().equals(userName) && !userSpeakContent.getToSpeakUser().equals(userName)){ //你对别的说的
if(userSpeakContent.isPrivate()){
showSelfToOtherContentPrivate(out,userSpeakContent); //自己对别人说的悄悄话
}else{
showSelfToOtherContent(out,userSpeakContent); //自己对别人说的话
}
}else if(!userSpeakContent.getSpeakUser().equals(userName) && !userSpeakContent.getToSpeakUser().equals(userName)){ //不是你说的,也不是对你说的
if(userSpeakContent.isPrivate()){
showOtherToOtherContentPrivate(out,userSpeakContent); //别人对别人说的悄悄话
}else{
showOtherToOtherContent(out,userSpeakContent); //别人对别人说的话
}
}else if(!userSpeakContent.getSpeakUser().equals(userName) && userSpeakContent.getToSpeakUser().equals(userName)){ //别人对你说的
if(userSpeakContent.isPrivate()){
showOtherToSelfContentPrivate(out,userSpeakContent); //别人对自己说的悄悄话
}else{
showOtherToSelfContent(out,userSpeakContent); //别人对自己说的话
}
}
}
}
}
}
out.println("<script>window.scroll(0,10000000);</script>");
out.flush();
}
//alert(top.UserListframe) 在线用户没有显示
// out.print("<SCRIPT>try{;top.fraRightFrame.main.UserListframe.document.all.LIST.innerHTML=\"");
out.print("<SCRIPT>try{;top.UserListframe.document.all.LIST.innerHTML=\"");
for (int i = 0; i < vecUserList.size(); i++) {
// out.print("<a href=# onclick=top.fraRightFrame.main.SpeakListframe.document.all.toUser.value='"+vecUserList.get(i).toString()+"'>" + vecUserList.get(i).toString()+"</a><br>");
out.print("<a href=# onclick=top.SpeakListframe.document.all.toUser.value='"+vecUserList.get(i).toString()+"'>" + vecUserList.get(i).toString()+"</a><br>");
}
//out.print("list.size="+vecUserList.size());//me 在线用户显示不出来
out.print("\"}catch(e){;}</SCRIPT>\n");
out.flush();
inUserList = vecUserList.size();
try{
Thread.sleep(500);
}catch(Exception e){
System.out.println("线程出错"+e);
}
if(canLogout){
UserSpeakContent closeSpeak=new UserSpeakContent();
closeSpeak.setSpeakTime(DateUtil.getNowTime());
closeSpeak.setSpeakUser(userName);
closeSpeak.setToSpeakUser("");
closeSpeak.setSpeakContent(userName+"退出聊天室");
closeSpeak.setLogout(true);
closeSpeak.setSpeakType(1);
vecContentList.add(closeSpeak);
out.println("<LI><B>***系统信息*** 你由于30分钟没发言,已经自动退出聊天室!</LI></B>");
out.flush();
canLogout=false;
break;
}
}
}
/**
* 显示用户列表
* @param out
* @throws java.lang.Exception
*/
private void showUserListframe(PrintWriter out) throws Exception {
out.println(
"<CENTER>在线用户</CENTER><HR><FONT ID=\"LIST\"></FONT></BODY></HTML>");
out.close();
}
/**
* 显示用户发言录入框
* @param out
* @param name
* @throws java.lang.Exception
*/
private void showSpeakListframe(PrintWriter out, String name,String toUser,boolean isPrivate) throws
Exception {
String checkStr="";
String[] strOut = new String[] {
"<form method=\"post\" action=\"\" onsubmit=\"if(document.all.content.value==''){alert('请输入你的发言');document.all.content.focus();return false;}\">",
"<input type=\"text\" name=\"name\" size=10 readOnly=true style=\"background-color: #66FFFF\">",
"对<input type=\"text\" name=\"toUser\" size=10 readOnly=true style=\"background-color: #66FFFF\">",
"<input type=\"checkbox\" name=\"isPrivate\" value=\"私聊\">私聊 ",
"说<input type=\"text\" name=\"content\" size=50>",
"<input type=submit value=' 发 表 '>",
" <a href=\"?page=SpeakList&type=exit\">退出</a>",
"</form>",
"<script>",
"document.all.content.focus();",
"</script>"
};
for (int i = 0; i < strOut.length; i++) {
out.println(strOut[i]);
}
if (!"".equals(name) && name != null) {
checkStr="<script>document.all.name.value='" + name +"';document.all.toUser.value='"+toUser+"';";
if(isPrivate){
checkStr=checkStr+"document.all.isPrivate.checked=true;";
}
checkStr=checkStr+"</script>";
out.println(checkStr);
}
out.close();
}
/**
* 改变为HTML字符
* @param value
* @return
*/
public static String filter(String value) {
if (value == null) {
return null;
}
char content[] = new char[value.length()];
value.getChars(0, value.length(), content, 0);
StringBuffer result = new StringBuffer(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case 60: // '<'
result.append("<");
break;
case 62: // '>'
result.append(">");
break;
case 38: // '&'
result.append("&");
break;
case 34: // '"'
result.append(""");
break;
case 39: // '\''
result.append("'");
break;
case 32: // ' '
result.append(" ");
break;
default:
result.append(content[i]);
break;
}
}
return result.toString();
}
public UserSpeakContent filterSelfMessage(UserSpeakContent content,String user){
//发给自己的私聊内容
if(content.isPrivate() && content.getToSpeakUser().equals(user)){
return content;
}
//公聊内容
if(content.isPrivate()==false){
return content;
}
//自己发的内容
if(content.getSpeakUser().equals(user)){
return content;
}
//发给所有人的内容
if(content.getToSpeakUser().equals("所有人")){
return content;
}
return null;
}
//显示系统信息
private void showSystemContent(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>***系统信息***</B> " + userSpeakContent.getSpeakContent() + "</LI>");
}
//显示用户自己对自己说
private void showSelfToSelfContent(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>你自言自语道: " + userSpeakContent.getSpeakContent() + "</B></LI>");
}
//显示用户自己对自己说的悄悄话
private void showSelfToSelfContentPrivate(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>你悄悄地自言自语道: " + userSpeakContent.getSpeakContent() + "</B></LI>");
}
//显示自己对别人说的悄悄话
private void showSelfToOtherContentPrivate(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>你</B> 对 " + userSpeakContent.getToSpeakUser() + " 悄悄地说: " + userSpeakContent.getSpeakContent() + "</LI>");
}
//显示自己对别人说的话
private void showSelfToOtherContent(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>你</B> 对 " + userSpeakContent.getToSpeakUser() + "说: " + userSpeakContent.getSpeakContent() + "</LI>");
}
//显示别人对别人说的悄悄话
private void showOtherToOtherContentPrivate(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>" + userSpeakContent.getSpeakUser() +
"</B> 对 " + userSpeakContent.getToSpeakUser() + " 悄悄地说: " + userSpeakContent.getSpeakContent() +
"</LI>");
}
//显示别人对别人说的话
private void showOtherToOtherContent(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>" + userSpeakContent.getSpeakUser() +
"</B> 对 " + userSpeakContent.getToSpeakUser() + "说: " + userSpeakContent.getSpeakContent() +
"</LI>");
}
//显示别人对自己说的悄悄话
private void showOtherToSelfContentPrivate(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>" + userSpeakContent.getSpeakUser() +
"</B> 对你悄悄地说: " + userSpeakContent.getSpeakContent() +
"</LI>");
}
//显示别人对自己说的话
private void showOtherToSelfContent(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>" + userSpeakContent.getSpeakUser() +
"</B> 对你说: " + userSpeakContent.getSpeakContent() +
"</LI>");
}
//显示你对所有人说的话
private void showSelfToAllContent(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>你</B> 对 所有人说: " + userSpeakContent.getSpeakContent() + "</LI>");
}
//显示别人对所有人说的话
private void showOtherToAllContent(PrintWriter out,UserSpeakContent userSpeakContent) {
out.println("<LI><B>"+userSpeakContent.getSpeakUser()+"</B> 对 所有人说: " + userSpeakContent.getSpeakContent() + "</LI>");
}
}
2.servlet:(LoginServlet.java: 登陆入口)
public class LoginServlet extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name=req.getParameter("name");
SystemUserInfo user=new SystemUserInfo();
user.setUserName(name);
req.getSession().setAttribute("session_UserInfo", user); //聊天室需要把用户名保存在session中
req.getRequestDispatcher("/speakHouse").forward(req, resp);
}
}
3.SystemUserInfo.java:
public class SystemUserInfo {
private String userName;
}
4.DateUtil.java
public class DateUtil {
public static Date getNowTime() {
Date nowTime=new Date();
return nowTime;
}
public static long getTwoTimeSub(Date end,Date start){
long minutes=(end.getTime()-start.getTime())/(1000*60);
return minutes;
}
}
- serverpush_web聊天(servlet实现).rar (19 KB)
- 下载次数: 72
发表评论
-
shiro+jwt实现认证功能
2022-08-11 07:47 717Shiro和JWT的区别 整合之前需要清楚Shiro和JWT的 ... -
web项目通过端口访问
2018-04-15 14:16 798发布到webapp下改一下web项目名为ROOT, ... -
tomcat 配置
2015-05-13 07:33 5511. 建立tomcat服务 A.在 ... -
eclipse 中自定义jsp模版
2011-05-17 22:16 2447首先随便打开一个jsp页,在网页中单击右键选择:prefer ... -
urlrewriter2.6在java中的应用 URL重写
2010-09-29 09:59 1543http://xiaopihai.iteye.com/blog ... -
内容管理系统CMS
2010-09-29 09:28 1120http://l530.spaces.live.com/blo ... -
web 网页中嵌套flash
2010-09-03 09:36 2123<object classid="clsid: ... -
web 开发一些组件
2010-08-26 11:24 1062http://www.live800.com/ Live ... -
xml
2010-06-24 11:00 993Node.ELEMENT_NODE == 1 No ... -
远程上传 上传之前预览图片,可以验证类型,大小
2010-06-23 16:45 17361.upload_http.jsp: <style ... -
改变文件上传按钮样式 input button
2010-06-22 09:40 4794<style type="text/css&q ... -
天气插件
2010-06-17 09:45 931http://service.weather.com.cn/p ... -
WebBrowser 打印
2010-05-28 13:50 1508function hide(printId){ //pr ... -
lodop打印控件
2010-05-28 11:05 8074WEB免费打印控件推荐 http://fxz-2008.it ... -
css设置页面的打印样式及css用于不同媒体介质的设置
2010-05-27 16:42 4695这几天做东西涉及到 ... -
图片缓存 image
2010-01-22 14:31 1493<script language ="Java ... -
gif动画合成
2009-11-18 14:37 1243http://xxyy9090.blog.163.com/bl ... -
div +css 网页排版
2009-11-06 10:20 1166<!DOCTYPE HTML PUBLIC " ... -
fusionCharts
2009-11-02 17:17 1073f -
jasperreport
2009-10-16 09:28 1165http://maqianli.iteye.com/blog/ ...
相关推荐
利用Java中的Servlet实现Server Push技术的聊天室,不仅能够提供实时的通信体验,还能加深对Servlet及其在Web开发中作用的理解。尽管长轮询和WebSocket提供了更高效的Server Push解决方案,但对于学习和理解基本原理...
本项目是一个利用Ajax反向推送(Comet技术)实现的Web聊天室源码,通过Java语言的Servlet作为控制器,提供了一个完整的可运行示例。 首先,我们要理解什么是Ajax反向推送(Comet技术)。传统的Ajax请求是客户端发起...
DWR(Direct Web Remoting)是一个开源的Java库,它简化了JavaScript和Java之间的交互,允许在Web应用中实现AJAX和Server Push功能。DWR使得开发者可以在浏览器端调用服务器端的Java方法,就像它们是本地函数一样,...
为了实现实时通信,如聊天应用、股票更新等场景,引入了Server Push技术。 Flex是一款开源的Flash开发框架,主要用于创建富互联网应用程序(RIA)。它允许开发者使用ActionScript语言编写前端界面,并与后端服务器...
在这个项目中,serverpush可能就是指利用WebSocket实现实时推送消息的技术,确保用户可以即时看到新消息。 5. **Session管理**:为了识别不同的在线用户,聊天室会使用Session来存储用户信息。每个用户的会话信息...
【简单聊天室(dwr2.0)】是一个基于DWR(Direct Web Remoting)2.0版本实现的在线聊天应用程序,旨在提供一个基础的交流平台,支持私聊和公开聊天功能,用户可以选择不同的字体和颜色来个性化自己的消息。这个项目采用...
Java服务端推送技术在Web应用中常常用于实现实时数据传输,例如聊天系统、股票更新、在线游戏等场景。Pushlet是一个基于Java的轻量级推送框架,它允许服务器主动向客户端推送信息,而非传统的HTTP请求-响应模式,即...
【描述】: 本文主要探讨了聊天室在信息时代的重要性和发展,以及国内外的研究现状和技术趋势,特别关注了JavaServer Pages(JSP)和Java Servlet在构建聊天室系统中的应用。 【标签】: CS(计算机科学) 【内容...
WebChat基于浏览器,通常采用Server Push或Client Pull技术实现信息的实时传输,而BBSChat则是基于Telnet的TCP协议,依赖于客户端的Telnet程序。随着技术的进步,WebChat逐渐占据了主流,因为它更加用户友好,无需...
Tomcat是一个流行的开源Java Servlet容器,支持Java EE的Web应用程序。配置Tomcat7以支持Comet技术,通常需要修改服务器的配置文件,如`server.xml`,设置`Connector`元素的`asyncTimeout`属性来支持长时间的HTTP...
"Pushlet Demo"是一个基于Java技术的服务器推送(Server Push)示例,它利用了Comet技术来实现实时的Web交互,这是对传统Ajax(Asynchronous JavaScript and XML)技术的一种扩展。在Ajax中,通常是由客户端发起请求...
ClientPushlet则是客户端的代理,它建立并维护与PushServer的连接,接收服务器推送的数据,并将这些数据分发给客户端应用。 Pushlet的工作流程大致如下: 1. 客户端通过HTTP请求连接到PushServer。 2. PushServer...
Pushlet是服务器推送技术的一种早期实现,由Jackrabbit项目开发,它基于Java Servlet和JavaServer Pages (JSP) 技术。Pushlet的核心理念是通过长连接保持客户端与服务器之间的通信,从而实现实时数据推送。 Pushlet...
- `PushService`:服务器端的推送服务,定义了添加、删除和推送消息的方法,开发者可以在此基础上实现具体业务逻辑。 - `ClientHandler`:客户端的处理器,通常是一个JavaScript对象,用于接收服务器推送的数据并...
然而,需要注意的是,Pushlet 是一个较老的技术,现代Web开发中更多地采用WebSocket或其他现代推送技术,如Server-Sent Events (SSE) 或基于HTTP/2的Push。这些技术提供了更好的性能和兼容性,更适合当前的Web环境。
在Web开发中,服务器向客户端实时推送数据是常见...在名为"serverPush"的压缩包文件中,可能包含了实现上述各种服务器推送方式的JAVA代码示例,开发者可以通过阅读和学习这些代码,进一步理解并掌握服务器推送的技术。
Tomcat作为轻量级的Web服务器和应用服务器,能够运行Java Servlet和JavaServer Pages (JSP)。在Tomcat中部署XMPP服务,可以使用Openfire或者Ignite Real Time等支持XMPP的服务器软件。 接着,你需要设置MySQL数据库...
这些客户端可以是Web浏览器、移动设备上的应用程序或者其他任何能够与Servlet容器通信的客户端。 4. **Event**:事件是Pushlet中传输的数据单元。当发布者创建一个事件并发送到服务器时,服务器会将这个事件推送给...
在Web应用程序中,WebSocket为实现低延迟、高效率的实时交互提供了可能,比如在线聊天、股票交易、游戏等场景。 在WebSocket实例中,通常会涉及以下几个关键组成部分: 1. **WebSocket Server**: 服务器端是...