页面每20秒显示一次,服务器端socket发送的数据服务器端Socket的设计是这样,验证成功后,每10秒发送一次数据于是我这样写,用Ajax每20秒访问一次Action,然后在Action里面解析接收到的Socket数据,然后显示在页面
这样写有一个问题,就是每20秒一次有一个请求和关闭连接,单个用户还好说,但是多个用户的话,服务器
压力是不是有点大,单个用户访问了15天后,程序报错说:
java.net.SocketException: No buffer space available (maximum connections reached?): JVM_Bind
但是程序已经做了处理关闭socket,DataOutputStream和DataInputStream于是想换个方法尝试,大概是这样
通过页面访问一次Action,然后在Action处理服务器端Socket每10秒发送一次的数据,然后解析,显示到页面上前面的访问每10秒解析都没有问题,就是解析后数据发送不到页面上
那现在我想问的是,上面的方法,是我的程序问题,
还是必须请求-解析-响应,也就是说需要每次请求,才能发送数据到页面
因为服务器端不会主动发送数据到页面

解决方案 »

  1.   


    你有多少并发?单用户访问15天后报异常,我觉得不是20秒去刷新的问题,而是你的程序中肯定有一些对象的内存没有得到释放。
    maximum connections reached,这个错误说明你的链接可能没关,或者在某些特定的情况下没关,
    如果这个问题不解决,你改成其它机制可能也不行。还有,你的后台是有一个线程在收Socket数据,还是每次到Action中的时候,采取建立到服务端的链接?
    应该采用一个独立的线程来专门收取数据,action收到ajax请求只是从一个缓冲拿数据就可以了。其实我觉得后台每秒钟处理前台的几十个请求,是小意思,
    按每秒10个计算,可以支持200个页面同时打开。
      

  2.   

    2#的一个建议不错,你再检查下是不是有些连接没及时关闭。然后你看看这个帖子:http://hi.baidu.com/showerliu/blog/item/7c6bb91bead893118718bf6f.html然后这里还有Sun论坛的一个回复:
    Chances are you are forgetting to close a socket, a database connection, or some other connection that uses sockets internally. See example program below.
    The alternative is that your program (or the sum of all programs running on your computer) really needs a lot of connections. In this case you'll need to find out how to increase the amount of socket buffer space that your operating system allocates. I'd start by googling for instructions. Or maybe you could redesign your program so that it doesn't use so much resources.
    大意也是说你可能忘记关闭socket,数据库连接或者其他一些内部使用socket的连接。然后还要找到如何提高操作系统分配的socket缓存等。然后整个异常栈的内容是什么?
      

  3.   

    显示和后端的数据传输分开吧,专门为显示建立二级缓存,而socket 由由服务器端向客户端推数据,并在客户端处理解析数据且放在二级缓存
      

  4.   

    对象内存没有释放,socket无非就是socket,DataOutputStream和DataInputStream 
    以及连接数据库的对象,但是这些,我都关闭了
    我的后台处理是每次到Action中,而非建立一个线程来处理解析数据
    应该采用一个独立的线程来专门收取数据,action收到ajax请求只是从一个缓冲拿数据就可以了。
    不是很明白,可以说的详细点吗
      

  5.   

    现在这行错误
    socket = new Socket(gobal.getIP("../../collectionIpConfig.properties"), 34567);
    public String getIP(String fileName) {
    Properties prop = new Properties();
    try {
    InputStream is = getClass().getResourceAsStream(fileName);
    prop.load(is);
    if (is != null)
    is.close();
    } catch (Exception e) {
    log.error("==配置文件没有找到或者读取采取机Ip错误==",e);
    }
    return prop.getProperty("ip");
    }
    在处理程序的时候,在finally有关闭socket
      

  6.   

    Ajax 请求会占用服务器额外的端口?不可能。
      

  7.   

    确实不可能
    错误指向这,是不是说socket错误
    但是我的socket有关闭啊
      

  8.   

    不知道你的Socket都是干什么的.想想会不会思路方面有问题呢?
      

  9.   

    对象内存没有释放,socket无非就是socket,DataOutputStream和DataInputStream 
    以及连接数据库的对象,但是这些,我都关闭了 你要确保在任何情况下都关闭,包括抛出异常等各类情况。
    没有见到相关代码,这么空对空,太难判断了。
    我的后台处理是每次到Action中,而非建立一个线程来处理解析数据 
    应该采用一个独立的线程来专门收取数据,action收到ajax请求只是从一个缓冲拿数据就可以了。 
    不是很明白,可以说的详细点吗 
    你先不要考虑你是一个web程序,首先,你现在所谈到的程序,和你所说的服务器端,是C/S模式,
    现在,你的client端就是Action,每次Action被请求都与服务器建立连接取数据。假设你要写一个客户端,连接你的服务器,怎么办?
    当然是与服务端建立一个常连接,有数据就实时收取了,就不存在每次去连的问题,这样资源消耗就小多了。
    这些收下来的数据,通过一定的方式公开出来,供它的客户端(在你的环境里就是Action)去使用。现在的问题只是如何把这个客户端放到Tomcat容器,有很多方法,给出常用的两个:
    1、增加一个Listener,在context加载的时候启动线程,连接服务端。
    2、做一个单例类,第一次访问的时候,建立到服务端的请求。
      

  10.   


    按照您的意思,程序的设计思路是不是这样:
    1)ThreadClient:和服务器端Socket建立连接,获取数据,
       处理成List后,然后request.getSession().setAttribute("slist",ServerList);
       也就是每解析一次数据后,都request.getSession()2)SocketAction:
      每20秒接收一次Ajax请求,获取slist,处理显示在页面上
      

  11.   

    按照您的意思,程序的设计思路是不是这样: 
    1)ThreadClient:和服务器端Socket建立连接,获取数据, 
      处理成List后,然后request.getSession().setAttribute("slist",ServerList); 
      也就是每解析一次数据后,都request.getSession() 
    怎么能放Session呢?后台线程是不知道Session的啊。
    放在一个大家都能取到的地方,比如全局变量就可以了。
    2)SocketAction: 
      每20秒接收一次Ajax请求,获取slist,处理显示在页面上 
      

  12.   

    有一点我不太明白,在客户端已经使用ajax轮询了,为什么还要使用socket每10s主动推送数据??
      

  13.   

    意思是:
       public class ThreadClient   implements Runnable {  public static List list;
     
     public void run(){
     while(true){
     //接收数据,然后处理成一个ServerList
                             list = ServerList;
     try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
     }
     }
     
     public static void main(String[] args){
     Thread th=new Thread(new Test());
     th.start();
     }
     }2)SocketAction: 
      List ServerList=ThreadClient.list
      //解析summerfeel:
      有程序c/s和b/s
      只要有客户端连接上去,采集程序(服务器端Socket)就发送数据
      

  14.   

      try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    这里应该删除的