?? gatewaymonitor.java
字號:
package com.cxt.platform.gateway;import java.io.*;import java.net.*;import java.util.*;import java.sql.Time;/** * Title: * Description: * 網關的監控,用于接受請求,返回相應的數據;如:線程監控、參數設定等 * Copyright: Copyright (c) 2001 * Company: * @author * @version 1.0 */public class GatewayMonitor extends Thread{ private int m_port; private boolean m_run; private GatewayThreadGroup m_gwthreadgroup; private Gateway m_gateway; final int BUFFER_SIZE=10240; final int START=10; final int STOP=20; final int GET=30; final int SET=40; private byte[] m_outbuf=new byte[BUFFER_SIZE]; private byte[] m_inbuf=new byte[BUFFER_SIZE]; public GatewayMonitor(GatewayThreadGroup tg,int port,Gateway gw) { m_port=port; m_run=true; m_gwthreadgroup=tg; m_gateway=gw; } //線程方法,子線程的入口 public void run() { ServerSocket serv=null; try { serv=new ServerSocket(m_port); } catch (Exception e) { System.err.println("Can't make monitor server!"); e.printStackTrace(); System.exit(10); } while(m_run) { Socket client=null; OutputStream clientSend=null; InputStream clientReceive=null; int out_len=0; int pos=0; int outpos=4; //預留報文長度的兩個字節和返回值的兩個字節,共四個 int iRetval=0; int ret=0; int len=0; try { client=serv.accept(); } catch (Exception e) { System.err.println("Error when accept"); e.printStackTrace(); continue; } try { clientSend = client.getOutputStream(); clientReceive = client.getInputStream(); //設定超時時間為5秒(5000毫秒) client.setSoTimeout(5000); //取整個報文的頭兩個字節,以便得到報文的長度 ret=clientReceive.read(m_inbuf,0,2); if( ret<2 ) //取報文頭兩個字節失敗! { System.err.println("Error when read length"); throw new Exception("讀報文出錯!return code="+ret); } pos+=ret; //根據頭兩個字節,計算長度 len=bytes2short(m_inbuf,0); if( len>BUFFER_SIZE-pos ) //長度超過了緩沖區的大小 { System.err.println("Error that length exceed buffer size"); throw new Exception("數據報文太長,超過緩沖區大小!length="+len); } //接收指定長度的數據 ret=clientReceive.read(m_inbuf,pos,len); if( ret<len ) { System.err.println("Error that length exceed buffer size"); throw new Exception("讀不到足夠的數據,請查看報文!length="+ret); } switch(m_inbuf[pos]) //命令域的第一個字節代表命令類別 { case START: //啟動 { switch(m_inbuf[pos+1]) //命令域的第二個字節代表具體命令 { case 1: //起動網關 m_run=true; break; default : //無效的啟動命令 break; } break; } case STOP: //停止 { switch(m_inbuf[pos+1]) { case 1: //停止網關 m_run=false; m_gateway.stop(); //冒充client向網關發起連接,以解除網關ServerSocket.accept方法的堵塞 /*try { Socket clientCheat = new Socket("localhost",m_gateway.getServerPort()); //下列用法JDK1.4以上才支持 //Socket clientCheat = new Socket(); //clientCheat.connect(new InetSocketAddress("localhost",m_gateway.getServerPort()),5000); // clientCheat.close(); } catch (Exception excp) { //無需處理 }*/ // break; default : //無效的停止命令 break; } break; } case GET: //查詢 { switch(m_inbuf[pos+1]) { case 1: //線程監控 GatewayHandler[] thread_list=new GatewayHandler[m_gwthreadgroup.activeCount()]; ret=m_gwthreadgroup.enumerate(thread_list); outpos+=addThreadHeader(outpos); for( int i=0;i<ret;i++ ) { outpos+=addThreadList(thread_list[i],outpos); } break; default : //無效的查詢命令 break; } break; } case SET: //設定 { switch(m_inbuf[pos+1]) { case 1: //日志級別 len=bytes2short(m_inbuf,pos+2); int logLevel=byteChar2Int(m_inbuf,pos+4,len); m_gateway.setLogLevel(logLevel); break; case 2: //重新裝載配置文件 break; default : //無效的設置命令 break; } break; } default : //無效的命令類型 break; } short2bytes(m_outbuf,2,iRetval); //返回值 short2bytes(m_outbuf,0,outpos-2); //返回報文的總長度 clientSend.write(m_outbuf,0,outpos); clientSend.close(); clientReceive.close(); client.close(); } catch (Exception e) { System.err.println("Error :"+e.toString()); e.printStackTrace(); try { clientSend.close(); clientReceive.close(); client.close(); } catch (Exception e1) { e1.printStackTrace(); System.err.println("Error when close socket,so how should i do???!!!"); } continue; } }// end while try { serv.close(); } catch (Exception e) { System.err.println("Error when close socket server,so how should i do???!!!"); e.printStackTrace(); } }//end of run //從byte數組中的指定偏移取出相應的整形數據,高位在前,兩個字節 private int bytes2short(byte[] src,int pos) { int sh; sh=src[pos]<0 ? (256+src[pos])*256 : src[pos]*256; sh+=src[pos+1]<0 ? 256+src[pos+1] : src[pos+1]; return sh; } //將整形數據存儲到指定的byte數組的指定偏移,高位在前,兩個字節 private void short2bytes(byte[] src,int pos,int value) { src[pos]=(byte)(value/256); src[pos+1]=(byte)(value%256); } //將字符串型byte數組轉成整形 private int byteChar2Int(byte[] src,int pos,int len) { Integer i=new Integer(new String(src,pos,len)); return i.intValue(); } private int addThreadHeader(int offset) { int pos=0; byte[] byteArray; ///////////////////////////////////網關的靜態屬性 //從網關中取出網關ID,并打到輸出緩沖區; byteArray=m_gateway.getGatewayNO().getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從網關中取出網關名,并打到輸出緩沖區; byteArray=m_gateway.getGatewayName().getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從網關中取出網關狀態,并打到輸出緩沖區; byteArray=String.valueOf(m_gateway.getGatewayStatus()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從網關中取出網關接入服務類名,并打到輸出緩沖區; byteArray=m_gateway.getReceiveServiceClassName().getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從網關中取出網關監聽端口,并打到輸出緩沖區; byteArray=String.valueOf(m_gateway.getServerPort()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從網關中取出網關最大允許連接數,并打到輸出緩沖區; byteArray=String.valueOf(m_gateway.getMaxClientCount()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從網關中取出網關最大線程數,并打到輸出緩沖區; byteArray=String.valueOf(m_gateway.getMaxThreadCount()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從網關中取出網關日志級別,并打到輸出緩沖區; byteArray=String.valueOf(m_gateway.getLogLevel()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從網關中取出網關的起動時間,并打到輸出緩沖區; byteArray=String.valueOf(new Time(m_gateway.getStartTime())).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; /////////////////////////////////////////////////////網關線程的動態屬性 //從線程組中取出接入的交易數,并打到輸出緩沖區; byteArray=String.valueOf(m_gwthreadgroup.getEntries()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從線程組中取出總服務的交易數,并打到輸出緩沖區; byteArray=String.valueOf(m_gwthreadgroup.getTotal()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從線程組中取出成功的交易數,并打到輸出緩沖區; byteArray=String.valueOf(m_gwthreadgroup.getSuccess()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從線程組中取出失敗的交易數,并打到輸出緩沖區; byteArray=String.valueOf(m_gwthreadgroup.getFail()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從線程組中取出當前正活動的線程數,并打到輸出緩沖區; byteArray=String.valueOf(m_gwthreadgroup.activeCount()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; /********************************************** ///////////////////////////////////////////////////////// for(int i=0;i<pos;i++) { System.out.print(m_outbuf[offset+i]+" "); } System.out.println(); ///////////////////////////////////////////////////////// **********************************************/ return pos; } private int addThreadList(GatewayHandler thread_list,int offset) { int pos=0; byte[] byteArray; //System.out.println("here:"+offset); //從線程對象中取出線程的名字,并打到輸出緩沖區; byteArray=thread_list.getName().getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從線程對象中取出線程正服務的交易碼,并打到輸出緩沖區; short2bytes(m_outbuf,offset+pos,thread_list.getTrcd().length); pos+=2; System.arraycopy(thread_list.getTrcd(),0,m_outbuf,offset+pos,thread_list.getTrcd().length); pos+=thread_list.getTrcd().length; //從線程對象中取出線程正服務的交易的狀態,并打到輸出緩沖區; byteArray=String.valueOf(thread_list.getStatus()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從線程對象中取出線程正服務的交易的起始時間,并打到輸出緩沖區; byteArray=String.valueOf(new Time(thread_list.getStartTm())).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; //從線程對象中取出線程正服務的交易的服務時間,并打到輸出緩沖區; byteArray=String.valueOf(System.currentTimeMillis()-thread_list.getStartTm()).getBytes(); short2bytes(m_outbuf,offset+pos,byteArray.length); pos+=2; System.arraycopy(byteArray,0,m_outbuf,offset+pos,byteArray.length); pos+=byteArray.length; /********************************************** ///////////////////////////////////////////////////////// for(int i=0;i<pos;i++) { System.out.print(m_outbuf[offset+i]+" "); } System.out.println(); ///////////////////////////////////////////////////////// **********************************************/ return pos; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -