📄 cmpp2socketconpool.java
字号:
package com.khan.sms.cmpp2control;
import com.khan.socket.*;
import java.net.Socket;
import java.io.*;
import com.khan.file.Log;
import com.khan.sms.cmpp2.*;
import com.khan.util.*;
/**
* <p>Title: </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: </p>
*
* @author not attributable
* @version 1.0
*/
public class Cmpp2SocketConPool extends SocketConPool {
//CmppParam cp = CmppParam.getInstance();
String sUser = null;
String sPass = null;
byte bVersion = 0;
static int iOriginator = 0;
public Cmpp2SocketConPool(String host,
int port,
int timeout,
int max_con,
String user,
String pass,
byte version,
int originator) {
super( host, port, timeout, max_con);
this.sUser = user;
this.sPass = pass;
this.bVersion = version;
this.iOriginator =originator;
}
private byte[] Receive(SocketPoolCon con) throws IOException {
byte[] data = new byte[4096];
int ilen = 0;
byte[] result = null;
DataInputStream dis = new DataInputStream(con.getSocket().getInputStream());
ilen = dis.read(data);
if (ilen < 1) return null;
int length = SocketCommon.getDWord(data, 0);
result = new byte[length];
System.arraycopy(data, 0, result, 0, result.length);
return result;
}
private void Send(SocketPoolCon con, byte[] data) throws IOException {
DataOutputStream dos = new DataOutputStream(con.getSocket().getOutputStream());
dos.write(data);
}
/**建立连接容器
* @return SocketPoolCon 返回一个连接容器*/
protected SocketPoolCon createCon() {
SocketPoolCon pCon = new SocketPoolCon();
boolean connected = false;
try {
pCon.socket = new Socket(Host, iPort);
pCon.socket.setSoTimeout(iTimeout);
connected = login(pCon);
if (connected){
nConNum++;
log.logOut("建立一个Socket, con num:" + nConNum + " max:" + nMaxCon);
}else{
pCon.socket.close();
pCon = null;
}
} catch (Exception e) {
err.logOut("建立连接失败", e);
}
return pCon;
}
protected boolean login(SocketPoolCon con) throws IOException {
boolean result = false;
Cmpp2Connect cc = new Cmpp2Connect(sUser, sPass, (byte) (bVersion));
cc.setSeqID( iOriginator++ );
byte[] login_data = cc.encodeCmpp();
//MsgID.PrintDataHex(login_data);
Send(con, login_data); //发送登录信息
byte[] login_resp_data = Receive(con); //接收信息
int command_id = SocketCommon.getDWord(login_resp_data, 4);
if (command_id == Cmpp2Command.CMPP_CONNECT_RESP) { //判断command id
Cmpp2ConnectResp ccp =(Cmpp2ConnectResp) new Cmpp2ConnectResp(login_resp_data).decodeCmpp();
result = (ccp.bStatus == 0x00); //设定登录标志
}
return result;
}
/**从连接池中取得连接(线程安全函数)
* @return SocketPoolCon 返回的数据库连接容器
* */
synchronized public SocketPoolCon get() {
if (listCon.size() > 0) {//有连接时,直接取得连接
//common.Assert("debug:"+Thread.currentThread().getName()+"获得socket!");
return (SocketPoolCon) listCon.removeFirst();
}
if (nConNum < nMaxCon) {//如果没有多余连接,但连接池未满,新建一个连接
SocketPoolCon con = null;
while ( ( con = createCon()) == null ) {
common.sleep(1000);
}
//common.Assert("debug:"+Thread.currentThread().getName()+"获得socket!");
return con;
}
err.logOut("获取连接池socket出错, too many con: " + nConNum + " max:" + nMaxCon);
return null;
}
/**销毁连接
* @param pCon SocketPoolCon*/
synchronized public void release(SocketPoolCon pCon) {
//common.Assert("debug:"+Thread.currentThread().getName()+"注销socket!");
listCon.add(pCon);
}
synchronized public void clearCon(){
try {
while (listCon.size() > 0) {
SocketPoolCon pCon = (SocketPoolCon) listCon.removeFirst();
pCon.socket.close();
nConNum--;
}
} catch (Exception e) {
err.logOut("回收socket连接池,关闭连接失败", e);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -