100分,求教一个困扰了自己两个月的问题,up者都有分,大家一定要帮我啊!

slowlycome 2003-06-08 09:27:02
用jsp+servlet+javabean做了一个聊天室,实现了滚屏显示,也就是服务器推送方式。在tomcat3.2.3上面一切正常,但无法移植到tomcat4以上版本和weblogic6.1上。具体问题的出现的情况是这样:
我的聊天室有公聊和私聊两个frame放在同一个框架页面内,两个页面都用下面类似的代码来实现的滚屏输出:
<%@ page autoFlush="false" import="java.lang.Thread"%>
while(true)
{
try
{
if(i<xnxi.size())
{
out.println("<span id=\"chp2\">"+xnxi.get(i)+"</span>");
i++;
out.flush();
}
Thread.currentThread().sleep(2000);
session.getCreationTime();
}
catch(Exception e)
{
break;
}
}
整个页面除了有这样两个frame之外还有另外三个用于显示其他信息的页面,整个系统在tomcat3.*.*的版本上都能正常运行,但一移植到tomcat4及weblogic6.1上的时候,问题就出现了,如果用服务器本身的浏览器登录,一切也正常,但只要是用别的客户机,页面就只能显示出最开始的两个frame,也就是公聊和私聊两个页面,而其后的页面就完全无法显示出来。
一开始,我以为是一些application对象因为jsp和servelt的线程同步问题产生了死锁,于是我又另外做了一个试验,试验如下:
我再次设计了一个框架页面,包含五个frame,前两三个是jsp,后面三个完全是htm,而前三个jsp都是很简单而且雷同的代码,如下:
<%@ page autoFlush="false" import="java.lang.Thread"%>
<%
System.out.println(Thread.currentThread().toString()+" is start");//在系统信息窗口内显示线程开始的信息
for(int i=0;i<20;i++)
{
try
{
out.println("safasdfasdfasdfasdfasdasdfasdfasdfasdf");
i++;
out.flush();
Thread.currentThread().sleep(2000);
}
catch(Exception e)
{
break;
}
}
System.out.println(Thread.currentThread().toString()+" is over");//在系统信息窗口内显示线程结束的信息
%>
这个时候出现的情况是前两个页面在不断的输出信息,而后面的三个页面一就一片空白没有反应,在系统后台信息窗口里面页只显示了两个线程start,而当这个两个线程over了之后,后面的页面就显示出来了,而第三个线程才启动,第三个页面也开始了输出。
后来我又做了一个类似的servlet来替代那三个jsp,但现象都一样。由此我推断,可能是tomcat4以上版本和weblogic6.1在从整个jsp容器层面上开始限制了jsp线程的数量,或者对out对象,或者response对象进行了某种形式的同步锁定,不知各位阅读此贴的高手是否有解决之法。
这个问题已经困扰了我两个月了,如果我的聊天室不能移植到更高的版本上,那它的存在就毫无意义了。我不想面对这样的结局。这个问题我曾经变相的在这个论坛上发过两次贴子,但都没有被解决。这一次只好用最后的两百分一博了,望各位一定关注。
...全文
65 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
javastart 2003-07-08
  • 打赏
  • 举报
回复
up,关注!!!
slowlycome 2003-07-08
  • 打赏
  • 举报
回复
结稿了!
多谢各位高手关心,问题最后还是被解决了,不过是自己最后选择了一种变通的方法实现的,我还是使用了推技术,只不过用了一个隐藏frame来接受服务器端的推送,方法如上面一样,因为如果用一个页面来实现的时候不会有冲突这个已经说过并且得到证实的,然后推送出来的信息是javascript信息,也就是说把推送出来的聊天信息通过javascript语言再写到那两个公聊和私聊页面上,这样在形式上就实现了两个frame都在滚屏输出了。我已经做到了,虽然是自己做出来但还是得到了大家的提醒,所以分数照给,愿各位以后多关心在下的贴子和问题。
shaokun305 2003-06-24
  • 打赏
  • 举报
回复
up.学习
ralihm 2003-06-24
  • 打赏
  • 举报
回复
先关注一下
slowlycome 2003-06-24
  • 打赏
  • 举报
回复
谢谢先,我试试看看!
wspsc 2003-06-20
  • 打赏
  • 举报
回复
我在我的机器上是可以的,只是方法有所改变,我是让当前的 JSP 页面新生成一个 Thread,具体代码片段如下:

<%!
class test implements Runnable{
private JspWriter o;
public test(JspWriter oo){
o =oo;
}
public void run(){
for (int i=0;i<100;i++){
try{
o.println(i + "<br>");
o.flush();
Thread.currentThread().sleep(200);
}catch(Exception e){

}
}
}
}
%>

<%
test t =new test(out);
Thread th =new Thread(t);
th.start();
th.join();
%>
slowlycome 2003-06-19
  • 打赏
  • 举报
回复
看来是没什么希望解决了!哎!
slowlycome 2003-06-18
  • 打赏
  • 举报
回复
wuyg(wuyuguang)
能大略的说明一下javascript读取服务器端信息的方法吗,目的当然是要达到滚屏输出,而不能让页面感觉出来是在不停的刷新。
huyiqi 2003-06-17
  • 打赏
  • 举报
回复
up
wuyg719 2003-06-17
  • 打赏
  • 举报
回复
我觉得你的设计思路有问题,应该是客户端即浏览器来刷新数据。
具体可以这样,在jsp页面写一段javascript的定时程序,让该定时程序等待一段时间之后主动
刷新它自己。
你原来的做法是非常规编程,服务器耗不起,杀掉也是正常的。
slowlycome 2003-06-17
  • 打赏
  • 举报
回复
看看还有没有人知道?
AHUA1001 2003-06-13
  • 打赏
  • 举报
回复
用APPLET可能会好一些,但是我觉得这样可能会影响速度。
bskkoypwfd 2003-06-13
  • 打赏
  • 举报
回复
up
wyhgg 2003-06-13
  • 打赏
  • 举报
回复
jdk版本???
bskkoypwfd 2003-06-13
  • 打赏
  • 举报
回复
up
lulin99 2003-06-13
  • 打赏
  • 举报
回复
有点烦!
slowlycome 2003-06-13
  • 打赏
  • 举报
回复
每天早上我都来自己up,心诚则灵,我相信这个问题一定能被解决的!
caoze 2003-06-12
  • 打赏
  • 举报
回复
d
retfu1 2003-06-12
  • 打赏
  • 举报
回复
gz
林巅峰 2003-06-12
  • 打赏
  • 举报
回复
up
加载更多回复(34)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧