⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmpp2socketconpool.java

📁 java支持的短信平台
💻 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 + -