zhubaomin
2025-04-07 1a2b07f01ba4616fd9e894dddf474b56d020158c
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/forTcp/TcpSessionCacheBk.java
New file
@@ -0,0 +1,187 @@
package com.dy.rtuMw.server.forTcp;
import com.dy.rtuMw.server.ServerProperties;
import org.apache.mina.core.session.IoSession;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.*;
import java.util.Map.Entry;
/**
 * 用Hashtable实现,但实测发现Hashtable并不线程安全
 */
public class TcpSessionCacheBk {
   /**
    * 用Hashtable而不用HashMap原因:
    * Hashtable线程安全的
    * HashMap线程不安全的
    * 多线程对sessionTable读出或存入,可能产生异常
    * TcpSessionCache是在多线程环境下运行
    */
   private static Hashtable<String, TcpSession> sessionTable = new Hashtable<String, TcpSession>() ;
   /**
    * 加入新的IoSession
    * @param rtuAddr
    * @param protocolName
    * @param ioSession
    */
   public static void putNewTcpSession(String rtuAddr, String protocolName, IoSession ioSession){
      TcpSession tcpSe = sessionTable.get(rtuAddr) ;
      if(tcpSe == null){
         tcpSe = new TcpSession() ;
         tcpSe.ioSession = ioSession ;
         sessionTable.put(rtuAddr, tcpSe) ;
      }else{
         tcpSe.ioSession = ioSession ;
      }
   }
   /**
    * 更新IoSession对应的rtuAddr
    * @param oldRtuAddr
    * @param newRtuAddr
    * @param protocolName
    * @param ioSession
    */
   public static void changeRtuAddr(String oldRtuAddr, String newRtuAddr, String protocolName, IoSession ioSession){
      if(oldRtuAddr != null && newRtuAddr != null && !oldRtuAddr.equals(newRtuAddr)){
         TcpSession tcpSe = sessionTable.get(oldRtuAddr) ;
         if(tcpSe == null){
            putNewTcpSession(newRtuAddr, protocolName, ioSession) ;
         }else{
            sessionTable.remove(oldRtuAddr) ;
            sessionTable.put(newRtuAddr, tcpSe) ;
         }
      }
   }
   /**
    * 得到TcpSession
    * @param rtuAddr
    * @return
    */
   public static TcpSession getTcpSession(String rtuAddr){
      return sessionTable.get(rtuAddr) ;
   }
   /**
    * 得到所有在线情况
    * @return
    */
   public static HashMap<String, Boolean> allOnLine(){
      HashMap<String, Boolean> map = new HashMap<String, Boolean>();
      Iterator<Entry<String, TcpSession>> it = sessionTable.entrySet().iterator() ;
      Entry<String, TcpSession> entry = null ;
      while(it.hasNext()){
         entry = it.next() ;
         map.put(entry.getKey(), entry.getValue().ioSession.isConnected()) ;
      }
      return map ;
   }
   /**
    * 得到所有RTU连接状态情况
    * @return
    */
//   public static List<RtuSessionStatus> allConnectStatus(){
//      List<RtuSessionStatus> list = new ArrayList<RtuSessionStatus>();
//      Iterator<Entry<String, TcpSession>> it = sessionTable.entrySet().iterator() ;
//      Entry<String, TcpSession> entry = null ;
//      while(it.hasNext()){
//         entry = it.next() ;
//         RtuSessionStatus vo = new RtuSessionStatus() ;
//         vo.rtuAddr = entry.getKey() ;
//         IoSession se = entry.getValue().ioSession ;
//         vo.onTrueOffLine = se.isConnected() ;
//         InetSocketAddress sa = (InetSocketAddress)se.getRemoteAddress() ;
//         if(sa != null){
//            InetAddress inetAddr = sa.getAddress() ;
//            if(inetAddr != null){
//               vo.ip = inetAddr.getHostAddress() ;
//               vo.port = sa.getPort() ;
//            }
//         }
//         list.add(vo) ;
//      }
//      return list ;
//   }
   /**
    * 得到IoSession
    * @param rtuAddr
    * @return
    */
//   public IoSession getIoSession(String rtuAddr){
//      TcpSession tcpSe = sessionMap.get(rtuAddr) ;
//      if(tcpSe != null){
//         return tcpSe.ioSession ;
//      }
//      return null ;
//   }
   /**
    * 网络是否连接
    * @param rtuAddr
    * @return
    */
   public static Boolean isConnect(String rtuAddr){
      TcpSession tcpSe = sessionTable.get(rtuAddr) ;
      if(tcpSe != null){
         return tcpSe.ioSession.isConnected() ;
      }
      return null ;
   }
   /**
    * 通过IoSession输出数据
    * @param rtuAddr
    * @param data
    * @throws Exception
    */
   public static void write(String rtuAddr, byte[] data) throws Exception{
      TcpSession tcpSe = sessionTable.get(rtuAddr) ;
      if(tcpSe != null){
         if(tcpSe.ioSession.isConnected()){
            tcpSe.ioSession.write(data) ;
         }else{
            throw new Exception("Rtu连接已经关闭!") ;
         }
      }else{
         throw new Exception("Rtu未曾上线!") ;
      }
   }
   /**
    * 设置上行数据时刻
    * @param rtuAddr
    */
   public static void cacheUpDataTime(String rtuAddr){
      TcpSession tcpSe = sessionTable.get(rtuAddr) ;
      if(tcpSe != null){
         tcpSe.lastUpDataTime = System.currentTimeMillis() ;
      }
   }
   /**
    * 更新上行数据时刻
    * 当上行数据时刻已经过去一定时长,上行数据时刻清空
    */
   public static void updateUpDataTime(Long now){
      Iterator<TcpSession> it = sessionTable.values().iterator() ;
      TcpSession tcpSe = null ;
      while(it.hasNext()){
         tcpSe = it.next() ;
         if(tcpSe.lastUpDataTime != null){
            if(now - tcpSe.lastUpDataTime > ServerProperties.lastUpDataTimeLive){
               tcpSe.lastUpDataTime = null ;
            }
         }
      }
   }
}