andysern
2016-09-01 09:56
采纳率: 6.3%
浏览 1.3k

AJAX长连接的服务器线程问题

正在学习AJAX的长连接的问题
在客户端用ajax去实现连接

  $.ajax({

      url: '/ajax',

      type: 'GET',

      data: 'what=test',

      timeout: 30000,

      //请求成功后触发

      success: function (data) {
clock = clock+1;
show.prepend('success invoke!' +data+'
');
switch(data){
case "error data":
//RevServer();

                        break;

                        case "ok":
                        RevServer();

                        break;

                        default:

                        }
                    },  


          //请求失败遇到异常触发  
          error: function (xhr, errorInfo, ex) { 
                    clockErr = clockErr+1;
                    show.prepend('error invoke!errorInfo:'+ errorInfo+"次数"+clockErr+'<br/>'); 
                    RevServer();
                    },


          //完成请求后触发。即在success或error触发后触发  
          complete: function (xhr, status) { 
                    show.prepend('complete invoke! status:' + status+",次数"+clock+'<br/>');
                     //RevServer();
                    }

现在出现一个问题,服务器端我之前是用while直接循环,但是好像多几次后就会使服务器产生异常。然后就往while里加了一个thread,但是这样一样,客户端就失效了,直接
进入了complete,如果不加thread就会一直处在连接中,加了线程连接就直接结束了。

switch(what){

        case "test":
            Thread test = new Thread(new Runnable(){//这里加了线程后,客户端就结束了
                public void run(){
                    while(a){
                        if(session.getAttribute("status")=="ok")a=false;
                    }
                    out.print("收到你的消息");
                    a = true;
                    session.setAttribute("status","nothing");
                }
            });
            test.start();

        break;

        case "setStatus":
            session.setAttribute("status","ok");
        break;  
    }

}


不加线程,就会比较好的运行。(不过感觉性能有问题)
switch(what){

        case "test":

                    while(a){
                        if(session.getAttribute("status")=="ok")a=false;
                    }
                    out.print("收到你的消息");
                    a = true;
                    session.setAttribute("status","nothing");
                }

        break;

        case "setStatus":
            session.setAttribute("status","ok");
        break;  
    }

}

请大家帮忙看看,如何加了线程让客户端良好运行呢你?

2条回答 默认 最新

相关推荐 更多相似问题