我在写一个无刷新聊天室,现在有一下问题:
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函数对于像空格,:,<,>这样的字符不能正确的解码!!!
这个问题怎么解决啊?这个问题困我昨天一整天,我在百度知道问这个问题没人回答。。所以我来这了,因为这里更专业。
问题有点长,谢谢你看到最后这句话!