socket通讯锁 :只允许一个线程对同一静态的ip地址进行通讯

public class SocketMessageLock {

	private static SocketMessageLock socketMessageLock ;
	
	/**
	 * map key 为当前socket通讯的静态ip地址;
	 * value通讯状态,true为正在通讯、false为可以进行下一次通讯
	 * 
	 */
	private static Map<String, Boolean> socketLocks = new Hashtable<String, Boolean>();
	
	static{
		instance();
	}
	
	private SocketMessageLock(){
		
	}
	
	private static synchronized SocketMessageLock instance(){
		if(socketMessageLock==null){
			socketMessageLock = new SocketMessageLock();
		}
		return socketMessageLock;
	}
	
	/**
	 * 添加socket通讯锁
	 * @param host socket通讯静态ip
	 */
	public static synchronized void addlock(String host){
		socketLocks.put(host, true);
	}
	
	/**
	 * 查看当前socket通讯是否完成,是否可进入下一次通讯 
	 * @param host socket通讯静态ip
	 * @return false 可进入下一次通讯,true 正在通讯
	 */
	public static synchronized boolean isLock(String host){
		boolean isLock = false;
		if(socketLocks.containsKey(host)){
			isLock = socketLocks.get(host);
		}
		if(!isLock){
			//给未添加或已完成的socket通讯 重新加锁
			addlock(host);
		}
		return isLock;	
	}
	
	/**
	 * 在socket通讯池同解除当前socket通讯锁
	 * @param host socket通讯的静态ip
	 */
	public static synchronized void loseLock(String host){
		if(socketLocks.containsKey(host)){ 
			socketLocks.put(host, false);
		}
	}
	
}

例:

 public JSONObject sendCalculateVt(JSONObject jsonObject) {  
       String ip = stationClient.getString("DEVICE_IP");
       String port = stationClient.getString("DEVICE_PORT");
   try {
            isLock = SocketMessageLock.isLock(ip);
            while (isLock) {
                //等待其正在通讯的线程结束
                try {
                    this.wait(100);
                    isLock = SocketMessageLock.isLock(ip);
                } catch (InterruptedException e) {
                    logger.error("等待其他socket通讯通讯线程结束失败", e);
                }
            }
        Boolean  result= SendSocket(ip, port,jsonObject);
        } catch (Exception e) {
            logger.error("失败");
        }finally {
            //释放socket通讯锁
            SocketMessageLock.loseLock(ip);
       
        }
   return CommonUtil.successJson(result);
}

 private boolean SendSocket(String ip, String port,JSONObject jsonObject) {
   try {
            tempSocket = new Socket(ip, Integer.parseInt(port));
            tempSocket.setSoTimeout(Constants.SOCKET_OUT_TIME * 1000);
            in = tempSocket.getInputStream();
            out = tempSocket.getOutputStream();

            /**
            *业务处理
            */
          //这个cmd指要写入的东西,也就是业务处理中要发送的指令
            out.write(cmd);
            out.flush();
         // in.read得到应答
            byte[] rb = new byte[1024];
            int c = in.read(rb);
        /*
        *  对应答c进行处理
        */

       } catch (Exception e) {
            logger.info("结束");
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
                tempSocket.close();
            } catch (Exception e) {
                logger.info("连接关闭失败");
            }
        }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值