?? smgp.java
字號:
package com.ut.smgp.api;
import com.ut.smgp.api.logic.*;
import com.ut.smgp.api.structure.*;
import com.ut.smgp.api.configure.*;
import com.ut.smgp.api.thread.*;
import java.util.*;
import java.io.*;
import java.net.Socket;
public class SMGP {
private initStruct init=new initStruct(); //收發(fā)或接收初始化數(shù)據(jù)
private initStruct initSend=new initStruct(); //發(fā)送初始化數(shù)據(jù)
private socketStruct con=new socketStruct(); //接收或收發(fā)端口
private socketStruct conSend=new socketStruct(); //發(fā)送端口
private smgpLogic smgp=new smgpLogic();
private activeTestThread active=null; //0:接收或收發(fā)activeTest; 1:發(fā)送activeTest
private activeTestThread activeSend=null;
private deliverThread deliver=null;
private deliverVector deliverQueue=new deliverVector();
private String deliverLock="0";//記錄當前接收端口的狀態(tài),0-網(wǎng)絡(luò)正常,其余網(wǎng)絡(luò)錯誤
//private Vector msgQueue=new Vector(); //消息接收隊列
//private Vector reportQueue=new Vector(); //狀態(tài)報告接收隊列
public SMGP() {
}
/********************************************************
* 設(shè)置通訊連接
*
*/
public void setSocket(socketStruct socket)
{
this.con=socket;
}
/**********************************************************
* 系統(tǒng)運行參數(shù)初始化
* @param fileName 配置文件的位置
* @return int 0 初始化正確; 其余 初始化失敗代碼
*/
public int initSMGPAPI()
{
return initSMGPAPI("../config/smgpc.ini");
}
public int initSMGPAPI(String initFile)
{
init=smgp.initApi(initFile);
if(init==null)
{
init=new initStruct();
return 1;
}
initSend.init(init); //初始化發(fā)送初始結(jié)構(gòu)
initSend.setLoginMode(0);
return 0;
}
/*********************************************************************
*
* 根據(jù)用戶的配置登錄系統(tǒng)
*
* activeMode : 1:send 2:receive
*
*/
private int login(int activeMode)
{
int result=0;
/* try{
if(deliver!=null) deliver.join();
if(activeSend!=null) activeSend.join();
if(active!=null) active.join();
}catch(InterruptedException e){System.out.println("SMGP.login:"+e);}*/
if(init.getServiceMode()==1)
{//收發(fā)公用收發(fā)類型接口
init.setLoginMode(2); //設(shè)置收發(fā)登錄模式
try{
con.socket = new Socket(init.getServerIp(), init.getServerPort());
con.socket.setSoTimeout(init.getRequestTimeOut());
}catch(Exception e)
{System.out.println(e);
return configure.ERROR_CONNECT_FAILED;
}
result=smgp.login(init,con);
if(result==0)
{//登錄成功
//建立active_test進程
if(active!=null) active.setCtl(1);//中止進程
try{
if(active!=null) active.join();
}catch(InterruptedException e){System.out.println("SMGP.login:"+e);}
active = new activeTestThread(con, init,deliverQueue,2);
active.start();
//{//建立接收信息的進程
if(deliver!=null) deliver.setCtl(1);//中止進程
try{
if(deliver!=null) deliver.join();
}catch(InterruptedException e){System.out.println("SMGP.login:"+e);}
deliver=new deliverThread(active,init,deliverQueue,deliverLock);
deliver.start();
}
}
else
{// =2 或其它為“收發(fā)分別用獨立的接收接口和發(fā)送接口”
if(activeMode==1)
{//建立發(fā)送端口
initSend.setLoginMode(0); //設(shè)置發(fā)送登錄模式
try{
conSend.socket = new Socket(initSend.getServerIp(), initSend.getServerPort());
conSend.socket.setSoTimeout(initSend.getRequestTimeOut());
}catch(Exception e)
{
System.out.println(e);
return configure.ERROR_CONNECT_FAILED;
}
result=smgp.login(initSend,conSend);
if(result==0)
{//登錄成功
//建立active_test進程
if(activeSend!=null) activeSend.setCtl(1);//中止進程
try{
if(activeSend!=null) activeSend.join();
}catch(InterruptedException e){System.out.println("SMGP.login:"+e);}
activeSend = new activeTestThread(conSend, initSend,deliverQueue,0);
activeSend.start();
}
}
else if(activeMode==2)
{//建立接收端口
init.setLoginMode(1); //設(shè)置接收登錄模式
try{
con.socket = new Socket(init.getServerIp(), init.getServerPort());
con.socket.setSoTimeout(init.getRequestTimeOut());
}catch(Exception e)
{
System.out.println(e);
return configure.ERROR_CONNECT_FAILED;
}
result=smgp.login(init,con);
if(result==0)
{//登錄成功
//建立active_test進程
if(active!=null) active.setCtl(1);//中止進程
try{
if(active!=null) active.join();
}catch(InterruptedException e){System.out.println("SMGP.login:"+e);}
active = new activeTestThread(con, init,deliverQueue,1);
active.start();
//{//建立接收信息的進程
if(deliver!=null) deliver.setCtl(1);//中止進程
try{
if(deliver!=null) deliver.join();
}catch(InterruptedException e){System.out.println("SMGP.login:"+e);}
deliver=new deliverThread(active,init,deliverQueue,deliverLock);
deliver.start();
}
}
}
return result;
}
/********************************************************************
*
* 發(fā)送單條信息
*
*/
public int SMGPSendSingle(submitStruct submit)
{
//判斷連接是否建立,若沒有建立則登錄
int result=0;
//if(init.getServiceMode()==1&&(con.socket==null||con.socket.isClosed()))
if(init.getServiceMode()==1&&con.socket==null)
{
result=login(0);
if (result != 0) {
con.socket = null;
return result;
}
}
if(initSend.getServiceMode()==2&&conSend.socket==null)
{
result=login(1);
if (result != 0) {
conSend.socket = null;
return result;
}
}
if(init.getServiceMode()!=1&&init.getServiceMode()!=2) return 1;
if(init.getServiceMode()==1)
{
con = active.getConnection();
result=smgp.sendSingle(init,con,submit,deliverQueue,2);
if(result==configure.ERROR_CONNECT_FAILED)
{//重新登錄
result=login(0);
if(result!=0)
{
con.socket=null;
return result;
}
active.setSocket(con);
smgp.sendSingle(init,con,submit,deliverQueue,2); //send again
}
}
else //if(init.getServiceMode()==2)
{
conSend = activeSend.getConnection();
result=smgp.sendSingle(initSend,conSend,submit,deliverQueue,0);
if(result==configure.ERROR_CONNECT_FAILED)
{//重新登錄
result=login(1);
if(result!=0)
{
conSend.socket=null;
return result;
}
activeSend.setSocket(conSend);
result=smgp.sendSingle(initSend,conSend,submit,deliverQueue,0); //send again
}
}
return result;
}
/********************************************************************
*
* 群發(fā)信息
*
*/
public int[] SMGPSendMulti(submitStruct[] submit,int timeout)
{
//判斷連接是否建立,若沒有建立則登錄
if(submit==null)
return null;
int[] allResult=new int[submit.length];
int result=0;
if(init.getServiceMode()==1&&(con.socket==null))
{
result=login(0);
for(int i=0;i<allResult.length;i++)
allResult[i]=result;
if (result != 0) {
con.socket = null;
return allResult;
}
}
if(initSend.getServiceMode()==2&&(conSend.socket==null))
{
result=login(1);
for(int i=0;i<allResult.length;i++)
allResult[i]=result;
if (result != 0) {
conSend.socket = null;
return allResult;
}
}
if(init.getServiceMode()!=1&&init.getServiceMode()!=2)
for(int i=0;i<allResult.length;i++)
allResult[i]=1;
if(init.getServiceMode()==1)
{
con = active.getConnection();
allResult=smgp.sendMulti(init,con,submit,deliverQueue,timeout,2);
if(result==configure.ERROR_CONNECT_FAILED)
{//重新登錄
result=login(0);
for(int i=0;i<allResult.length;i++)
allResult[i]=result;
if(result!=0)
{
con.socket=null;
return allResult;
}
active.setSocket(con);
smgp.sendMulti(init,con,submit,deliverQueue,timeout,2); //send again
}
}
else //if(init.getServiceMode()==2)
{
conSend = activeSend.getConnection();
allResult=smgp.sendMulti(initSend,conSend,submit,deliverQueue,timeout,0);
if(result==configure.ERROR_CONNECT_FAILED)
{//重新登錄
result=login(1);
for(int i=0;i<allResult.length;i++)
allResult[i]=result;
if(result!=0)
{
conSend.socket=null;
return allResult;
}
activeSend.setSocket(conSend);
allResult=smgp.sendMulti(initSend,conSend,submit,deliverQueue,timeout,0); //send again
}
}
return allResult;
}
/*****************************************************************************
*
* 獲取接收隊列的短消息
*
*/
public deliverMsg SMGPDeliver(int timeout)
{
//判斷連接是否建立,若沒有建立則登錄
int result=0;
deliverMsg msg=new deliverMsg();
if(init.getServiceMode()==1&&this.con.socket==null)
{
result=login(0);
if ( result!= 0)
{
msg.setResult(result);
msg.setDeliver(new deliverStruct[0]);
return msg;
}
}
if(init.getServiceMode()!=1&&this.con.socket==null)
{
result=login(2);
if ( result!= 0)
{
msg.setResult(result);
msg.setDeliver(new deliverStruct[0]);
return msg;
}
}
if(con.socket==null)
{
result=configure.ERROR_CONNECT_FAILED;
msg.setResult(result);
msg.setDeliver(new deliverStruct[0]);
return msg;
// return result;
}
deliverStruct[] deliverLine;
synchronized(deliverQueue)
{//接收數(shù)據(jù)
deliverLine = new deliverStruct[deliverQueue.size()];
for (int i = 0; i < deliverLine.length; i++) {
deliverLine[i] = new deliverStruct();
deliverLine[i] = deliverQueue.get(i);
}
deliverQueue.clear();
}
if(deliverLine.length==0)
{ //沒有數(shù)據(jù),等待接收
deliver.setTimeOut(timeout);
deliver.setCtl(3);//告訴deliver,這是用戶喚醒的,不允許再度睡眠,以避免死鎖
deliver.interrupt(); //再次啟動
synchronized(deliverLock)
{//等待用戶設(shè)定的時間
result=Integer.parseInt(deliverLock);//獲取接收狀態(tài)
deliverLock = "0";
}
deliver.setCtl(2);//告訴deliver,網(wǎng)絡(luò)不通,可以睡覺了
synchronized(deliverQueue)
{ //再次接收數(shù)據(jù)
deliverLine = new deliverStruct[deliverQueue.size()];
for (int i = 0; i < deliverLine.length; i++) {
deliverLine[i] = new deliverStruct();
deliverLine[i] = deliverQueue.get(i);
}
deliverQueue.clear();
}
}
/* timeout=1000000000;
try{
if (deliverLine.length == 0) {
deliver.setDeliv(Thread.currentThread());
if(timeout!=0)
Thread.sleep(timeout);
else
Thread.yield();
}
}
catch(InterruptedException interruptedexception)
{
System.err.println("Failed to sleep: " + interruptedexception);
}*/
//return result;
msg.setResult(result);
msg.setDeliver(deliverLine);
return msg;
// return deliverLine;
}
/* private int getDeliverLock(int i)
{
//int i=Integer.parseInt(deliverLock);
switch(i)
{
case 0:
return 0;
case configure.ERROR_CONNECT_FAILED:
return configure.ERROR_CONNECT_FAILED;
case configure.ERROR_RECEIVE_FAILED:
return configure.ERROR_RECEIVE_FAILED;
case configure.ERROR_LOGIN_FAILED:
return configure.ERROR_LOGIN_FAILED;
}
return configure.ERROR_RECEIVE_FAILED;
}*/
/********************************************************************************
*
* 斷開連接
*
*/
public int SMGPDisconnect()
{
int result=0;
if(init.getServiceMode()==1)
{
smgp.exit(con, init, deliverQueue, 2);
}
if(init.getServiceMode()==2)
{
smgp.exit(con, init, deliverQueue,1);
smgp.exit(conSend, initSend, deliverQueue,0);
}
if(deliver!=null) deliver.setCtl(1);//中止進程
if(active!=null) active.setCtl(1);//中止進程
if(activeSend!=null) activeSend.setCtl(1);//中止進程
try{
if(deliver!=null&&deliver.isAlive()) deliver.join();
}catch(InterruptedException e){System.out.println("SMGP.SMGPDisconnect:"+e);}
try{
if (activeSend != null&&activeSend.isAlive())
activeSend.join();
}catch(InterruptedException e)
{System.out.println("SMGP.SMGPDisconnect:"+e);}
try{
if(active!=null&&active.isAlive()) active.join();
}catch(InterruptedException e)
{System.out.println("SMGP.SMGPDisconnect:"+e);}
try{
if(con.socket!=null)
{
con.socket.close();
con.socket=null;
}
}catch(IOException e)
{System.out.println("SMGP.SMGPDisconnect"+e);}
try{
if (conSend.socket != null)
conSend.socket.close();
conSend.socket=null;
}catch(IOException e)
{System.out.println("SMGP.SMGPDisconnect"+e);}
return result;
}
/*********************************************************************************
*
* 發(fā)送active
*
*/
public int SMGPActiveTest()
{
if(con.socket!=null) //測試接收或收發(fā)端口
return smgp.activeTest(con,init,deliverQueue,2);
else if(conSend.socket!=null) //測試發(fā)送端口
return smgp.activeTest(conSend,initSend,deliverQueue,0);
else //無可用端口,測試失敗
return 1;
}
public static void main(String[] args) throws InterruptedException
{
SMGP smgp=new SMGP();
smgp.initSMGPAPI("e:\\smgpc.ini");
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -