?? inputstreamhandler.java
字號:
package com.ll.smsbeans;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.ll.smsbeans.cmpp3.CmppPacketParser;
import com.ll.smsbeans.log.LogCommon;
/**
* 建立一個輸入線程,并且將在這個線程中將接收到的數據包通過 <code>CmppPacketParser</code>
* 拆包。
*
* 其實不用一定在這個線程中拆包,在ConnetionBean中作這個操作也是可以的,好處就是能夠處理更多的拆包事件,
* 壞出就是ConnetionBean看起來不夠優美了,呵呵。
*/
public final class InputStreamHandler extends Thread
{
/** 輸入流 */
private InputStream in = null;
/** 父對象 (ConnectionBean object), 用于處理消息回調 */
private ConnectionBean.InputStreamInterface isi = null;
private CmppPacketParser cpp;
private boolean parsingDone = false;
static Logger _log;
/**
* 建立 <code>InputStreamHandler</code> 實例。
*
* @param in <code>InputStream</code> 服務器連接的輸入流
*/
public InputStreamHandler(ConnectionBean.InputStreamInterface isi)
{
this.isi = isi;
cpp = new CmppPacketParser();
}
/**
* 設置器連接的輸入流。
*
* @param in <code>InputStream</code> 服務器連接的輸入流
*/
public void setInputStream(InputStream in)
{
this.in = in;
}
/**
* 線程的主要部分,接收數據,拆包處理。
*/
public final void run()
{
if (in == null)
throw new RuntimeException(
"attempting to start InputStreamHandler without input to "
+ "monitor");
while (!parsingDone)
{
try
{
byte[] mybytes = new byte[4];
in.read(mybytes);
int packetlen =
(0xff & mybytes[0])
<< 24 | (0xff & mybytes[1])
<< 16 | (0xff & mybytes[2])
<< 8 | 0xff & mybytes[3];
if (packetlen <= 0)
throw new IOException("connect error!");
byte[] databytes = new byte[packetlen - 4];
int readLen = in.read(databytes);
if (readLen != packetlen - 4)
throw new IOException("connect error!");
if(_log.isLoggable(LogCommon.DEBUG_LEVEL))
_log.log(LogCommon.DEBUG_LEVEL,LogCommon.getLogBin("Received Data",mybytes, databytes));
Packet p = cpp.parser(databytes);
if (p != null)
received(p);
} catch (IOException e)
{
if (parsingDone == true)
return;
isi.unexpectedThreadDeath(e);
} catch (Exception e)
{
_log.severe(e.getMessage());
if (parsingDone == true)
return;
isi.unexpectedThreadDeath(e);
}
}
_log.warning("InputStream: parsing done");
parsingDone = true;
}
/**
* <code>received</code> 當InputStreamHandler接收到數據包后,這個方法回調ConnetionBean向其它對象廣播接收事件,
*
* @param p a <code>Packet</code> which was just received and
* recognised.
*/
public void received(Packet p)
{
isi.received(p);
}
/**
* 終止運行。
*
*/
public void shutdown()
{
_log.fine("InputStream: shutdown");
parsingDone = true;
this.interrupt();
_log.fine("InputStream: interrupted");
}
static {
_log = Logger.getLogger("com.ll.smsbeans.InputStreamHandler");
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -