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("连接关闭失败");
}
}
}