本帖最后由 ljw714 于 2010-12-27 16:29:20 编辑

解决方案 »

  1.   

    因为长连接的话,服务端得到的 Socket 是不关的,因此数据一直能读到。只能靠报文长度来控制。
      

  2.   


    这句我不是很理解。我理解的SOCKET通信应该是客户端发送一次数据,服务端接收,并返回数据。报文长度来控制只是控制服务端要读取客户端的哪些数据来处理。我现在的问题是客户端发起一次请求,服务端要响应一次,而不是客户端发了10次,服务端一次来处理。我现在不清楚长连接是指客户端发起10次,服务端一次响应,还是客户端发一次,服务端响应一次,只是每次的连接都是同一个。说明白一点就是socket.accept()这个监听,是在客户端connect的时候响应呢,还是在write的时候响应?
      

  3.   

    在TCP这一层,更本不存在什么长连接的概念,这些都是认为造出来的
    也不知道那个白痴先想出来的.....
    你想一直保持TCP的连接,有两个方式
    1.发送带外数据保持连接
    2.发送心跳报文希望楼主也不要被那些白痴人的概念给吓着了,如果是在HTTP层做应用建议你看看
    bayeux protocolgood luck for you
      

  4.   

    发一次 响应一次, 长连接一般是异步的,因为连接不断所以会话都是一个说明白一点就是socket.accept()这个监听,是在客户端connect的时候响应呢,还是在write的时候响应?
    这个是在客户端connect的时候生成套接字, write的时候  对应的是server的read
      

  5.   

    那简单的同步短连接就可以了嘛, socket write后 read 完 就关掉,下一次新建个socket 连接 wirte -> read 然后关掉……就这么重复……你这个 是要求消息处理是同步的
      

  6.   


    我认为想出所谓长连接不是白痴,而是一种创新。以避免好不容易建立好的连接,传输几十个字节就关了,这有点太可惜了。这道理跟基于 TCP 的 JDBC 数据库连接池一样。
      

  7.   

    那你就不关好了嘛……socket 一直保持建立状态, os write  ,  is read , 定义实例变量就好了
      

  8.   

    定义好一个完整的消息格式就可以了
    这个格式可以是定义消息的长度 也可以定义特殊的字符作为消息的开始和结束
    一个例子如下
    StringBuffer sb = new StringBuffer("");
    byte[] buffer = new byte[1];
    System.out.println("------------准备获取返回信息...-----------");
    while(buffer[0]!='!'&&-1!=is.read(buffer))
    {
    System.out.println("------------准备获取返回信息.........-----------");
    String temp = new String(buffer);
    sb.append(temp);
    }
    System.out.println("return Message is ["+sb.toString()+"]");
    这个消息的结束符是'!' 一个感叹号。