edgar108 2009-08-07 09:50 采纳率: 100%
浏览 272
已采纳

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

我在写一个无刷新聊天室,现在有一下问题:
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 2009-08-07 15:42
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法