首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

积存半年之久的有关问题,WEB推技术中怎么实现客户端与服务器端连接不断开

2012-01-19 
积存半年之久的问题,WEB推技术中如何实现客户端与服务器端连接不断开?小妹不才,查了很多WEB推技术的资料,

积存半年之久的问题,WEB推技术中如何实现客户端与服务器端连接不断开?
小妹不才,查了很多WEB推技术的资料,可是始终没搞明白如何持续往IE客户端输出数据,恳求高手指点。

        我现在只能完成一次输出,具体过程如下:
        1.客户端IE输入指定网址,假设访问端口8080;
        2.服务器端通过监听8080端口,一旦发现有连接,即创建一个socket,并建立一个线程。
        3.在线程中创建该socket得输出与输入对象,在socket.close前可以成功通过输出对象往IE输出数据,但无法持续输出;若使用线程.sleep,在客户端中展现也是先一直等待,直到sleep时间结束后一次输出所有记录,而不是分次持续输出。

        附上我的测试代码,请各位达人一定教教我啊,为了这个简单的东西郁闷了好久。先谢过~


//类ChatServer   主服务,服务器端监控类

import   java.io.*;
import   java.net.*;
import   java.util.Date;
public   class   ChatServer{

        public   static   void   main(String[]   args)   throws   Exception{
                (new   ChatServer()).monitor();
        }

        public   void   monitor()   throws   Exception   {
                int   port   =   8080;
                int   i=1;
                ServerSocket   srvSocket   =   new   ServerSocket(port);
                System.out.println( "Listenning   at   "   +   port   +   "   ... ");
                System.out.println( "Accepting   connection... ");
                while   (true)   {
                        try   {  
                                Socket   socket   =   srvSocket.accept();
                                long   session_id   =   new   Date().getTime();
                                System.out.println( "new   socket: "+i++);
                                Thread   t   =   new   ThreadedChatHandle(socket);
                                t.start();
                        }   catch   (IOException   e)   {
                                System.out.println( "Exception   occurs   when   accept():   "   +   e.getMessage());
                        }
                }
        }

}

//类ThreadedChatHandle   线程,处理类
import   java.io.*;
import   java.net.*;

public   class   ThreadedChatHandle   extends   Thread{

        private   Socket   socket;

        private   BufferedReader   in;

        private   PrintStream   os   ;



        //private   PrintWriter   out;

        protected   String   ip;
       
        InetAddress   ia   ;
       
        int   port   =   8080;

        public   ThreadedChatHandle(Socket   psocket)   {
                this.socket   =   psocket;
                ia   =   socket.getInetAddress();
                //ip   =   ia.getHostAddress();
                try   {
                        in   =   new   BufferedReader(new   InputStreamReader(socket
                                        .getInputStream()));
                        //out   =   new   PrintWriter(new   BufferedWriter(new   OutputStreamWriter(
                        //                 socket.getOutputStream())),   true);
                        os   =   new   PrintStream(new   BufferedOutputStream(socket.getOutputStream()));
                }   catch   (IOException   e)   {
                System.out.println(e.getMessage());
                }
                setDaemon(true);
        }

        public   void   run()   {
        int   i=0;
//           读取客户头端信息    
                try   {
                String   line   =   in.readLine();
                while   (line   !=   null   &&   !line.equals( " "))   {
                System.out.println( "line: "+line);
                        line   =   in.readLine();    
                }
                String   webMessage   =   "HTTP/1.0   200   ok\r\n "   +
                "Content-Type:   text/html\r\n "   +
                "Content-Length:   100\r\n "   +
                "\r\n "   +
                " <html> <body> \r\n ";
                os.write(webMessage.getBytes());
               


                }   catch   (Exception   e)   {
                System.out.print( "header: "+e.toString());
                }
                while   (true)   {
                        try   {
                        i++;                
                                //out.println( "用out变量输出的 "+i);                              
                                //out.flush();
                        //socket   =   new   Socket(ia,port);  
                        //os   =   new   PrintStream(new   BufferedOutputStream(socket.getOutputStream()));
                                String   str   =   "aaa "+i   + "\r\n ";
                                System.out.println(str);
                                System.out.println(os.toString());
                                os.flush();
                        os.write(str.getBytes());
                                os.flush();
//                             不close,上面的内容就不输出
                                os.close();  
                                socket.close();
                               
                                sleep(6000);
                               
//                             close以后socket就断开,所以下面的就不会输出
                        socket   =   new   Socket(ia,port);  
                        os   =   new   PrintStream(new   BufferedOutputStream(socket.getOutputStream()));
                                os.write( "bbb\r\n ".getBytes());  
                                os.flush();


                                os.close();    
                                socket.close();
                                System.out.println( "out   end! ");
                        }   catch   (Exception   e)   {
                                try   {
                                System.out.print( "1--: "+e.toString());
                                        socket.close();
                                }   catch   (Exception   ee)   {
                                System.out.println( "2--: "+ee.toString());
                                }
                                break;
                        }
                }
                try   {
                        socket.close();
                }   catch   (Exception   e)   {
                }
               
        }

}

[解决办法]
Ajax
[解决办法]
socket的模式
阻塞 非阻塞
你的系统 是 什么???
[解决办法]
http://blog.csdn.net/juvencoco/archive/2004/12/27/230469.aspx
不知有帮助吗?
[解决办法]
最简单的方法就是服务器一直不会关闭Socket,
while(true) {
Thread.sleeep(x);
out.println(something);
}


这样一直等待下去,客户端关闭时会产生异常跳出While循环。
不过这个方法会导致服务器线程数随着客户机的上升的
[解决办法]
用PrintStream的flush方法不能输出吗?
[解决办法]
学习Http1.1协议.
[解决办法]
synchronized (this) {
wait(5000);
}
[解决办法]
我刚好看了一下OpenCHAT,用到了wait和notify,好像还用到了if goto语句,比较偏门。
[解决办法]
服务端是不是要向服务端推数据的,只有客户端主动的向服务端请求数据,服务端才会根据请求的类型给客户端返回数据,在企业应用的情况下,通常是在客户端登录的时候与服务端建立一个session,session是有超时限制的,为了确保这个session不会断开,只有客户端向服务端发轮循消息,在使用轮循消息时,要考虑到系统的优化,比如当客户端向服务端发送真正在业务数据时,这个轮循消息应该暂时停止。


[解决办法]
大的联天室都是用ACTIVEX组件做的,这样可以保持长时间的连接,只用页面语言有一定的难度,而且效率不高。
[解决办法]
学习一下。

热点排行