是发送心跳包还是有其他方法?长连接是不是连接服务器的对象要保存起来?最好能给个客户端例子。谢谢~

解决方案 »

  1.   

    只要在client不释放连接,服务器端的run里边写while(TRUE)循环,那么就可以长期连接
      

  2.   

    主要要点有3个:
    1)客户端类要定义成单态类:即定义声明一个私有构造,并定义一个自身的私有静态变量以免被多次实例化。
    2)定时发送心跳包;
    3)报文发送要固定格式(固定结束符或在开头说明报文长度)
    public class MyClient{
        //确保只有一个实例
        private final static MyClient instance = new MyClient();
       //服务端对象
        private Socket server;
        //连接忙标志,用于发送心跳包判读
         private boolean isFree;
        //心跳检测频率(毫秒)
         private long FREN_Q= 30*1000;//30秒
         //心跳包内容
         private final static HELLO = "hello";
        //声明为私有方法,防止外部实例化
        private MyClient()
        {
        }
        //获取实例
        public MyClient getInstance()
        {
          return instance;
        }
       //建立连接
        private void connect()
       {
         try{
          ...
          checkTimer();
         }catch()
         {...}
       }
       
      //报文发送处理
       public byte[] process(byte[] data) {
         isFree =false;
         ....
         isFree = true;
       }
       //心跳检测
       private void checkTimer() {
         if(isFree) {
            process(HELLO.getBytes());
         }else {
            ...
         }     
       }
    }
      

  3.   

    这是一个单线程的简单例子,实际使用中可以根据业务需要写成runnable的