edgar108
edgar108
2009-08-07 09:50

写了一个无刷新聊天室,遇到一些问题!!

已采纳

我在写一个无刷新聊天室,现在有一下问题:
1. 我把用户所有的聊天内容存在了servletcontext中的msg属性中,因为servletcontext不是线程安全的,在修改msg属性的地方我是这么写的:
[code="java"]
synchronized(lock) //lock是一个实例变量,空的byte[]数组。
{
if(msg==null)
{
this.getServletContext().setAttribute("msg", sb.toString());

}
else
{
this.getServletContext().setAttribute("msg",msg+"\n"+sb.toString());
}
}
[/code]

当在线人数很多的时候,这么写是不是对效率影响很大?如果不应该这么写,还可以用什么方法?

2.在客户端中,有以下代码:
[code="java"]
setInterval(function()
{
$.post("ChatServlet?method=getNewMessageAndNum",null,function(response)
{
if(response!=null && response!="null")
{
var data = response.split(",");
var msg = decodeURI(data[0]);
var num = decodeURI(data[1]);
alert(msg);
//alert(data[1]);
if($("#area").val()!=msg)
{
$("#area").val(msg);
}
$("#num").html(num);

}

});
},2000);

[/code]

我的思路是在客户端,每个2秒钟就向服务器发送一个请求,来更新聊天内容和在线人数,还是上面的问题,当在线人数很多的时候,这样写效率怎么样? 比如说500人同时聊天,那么服务器每秒钟要接受250个请求。(因为我还是学生,没有实际经验,对于访问量对于效率的影响还不太了解)。

3.javascript中怎么对URLEncoder.encode编码后的字符串进行解码?
对于每一次请求:$.post("ChatServlet?method=getNewMessageAndNum",null,function(response){..});
服务器返回的是:return URLEncoder.encode(msg, "utf-8")+","+URLEncoder.encode(num+"","utf-8");

其中msg是所有的聊天信息,用URLEncoder.encode(msg, "utf-8")对其进行了编码,","后面的是在线人数。

我是用decodeURI函数来解码的,比如说msg的内容 是"聊天室游客说: dddd"
上面的代码中有:var msg = decodeURI(data[0]);解码后得到的是"聊天室游客说%3A+dddd" 。
也就是说decodeURI函数对于像空格,:,<,>这样的字符不能正确的解码!!!

这个问题怎么解决啊?这个问题困我昨天一整天,我在百度知道问这个问题没人回答。。所以我来这了,因为这里更专业。
问题有点长,谢谢你看到最后这句话!

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • swit1983 swit1983 12年前

    一个聊天室里面有很多用户,每个用户有属于自己的聊天信息,可以在servletcontext 放一个map,用每个用户作为key,他的聊天信息作为value(或者用个用户信息对象,给一个状态,说明这条信息是否已经打印到客户端),不存在同步问题,保证每个用户都是唯一的就可以,乱码问题 ,AJAX传递的时候用的是UTF-8编码,利用encodeURI()向服务器发送,用URLDecoder.decode()解码就可以了,服务器想客户端发送,只要设置response.setCharacterEncoding("UTF-8");就行了不用URLEncoder.encode编码,这个要放在写入输出流的前面。

    点赞 评论 复制链接分享

相关推荐