connector = aConnector;
}
@Override
public void run() {
WebSocketEngine engine = getEngine();
int lMaxFrameSize = JWebSocketCommonConstants.DEFAULT_MAX_FRAME_SIZE;
EngineConfiguration config = engine.getConfiguration();
if (config != null && config.getMaxFramesize() > 0) {
lMaxFrameSize = config.getMaxFramesize();
}
byte[] lBuff = new byte[lMaxFrameSize];
int pos = -1;
int lStart = -1;
try {
// start client listener loop
mIsRunning = true;
// call connectorStarted method of engine
engine.connectorStarted(connector);
while (mIsRunning) {
try {
int b = mIn.read();
// start of frame
if (b == 0x00) {
pos = 0;
lStart = 0;
// end of frame
} else if (b == 0xff) {
if (lStart >= 0) {
if (pos <= lMaxFrameSize) {
RawPacket lPacket = new RawPacket(Arrays.copyOf(lBuff, pos));
try {
engine.processPacket(connector, lPacket);
} catch (Exception ex) {
mLog.error(ex.getClass().getSimpleName()
+ " in processPacket of connector "
+ connector.getClass().getSimpleName()
+ ": " + ex.getMessage());
}
} else {
mLog.error("Datapacket exceeded maximum size of " + lMaxFrameSize + " bytes and will not be processed!");
}
}
lStart = -1;
// end of stream
} else if (b < 0) {
mCloseReason = CloseReason.CLIENT;
mIsRunning = false;
// any other byte within or outside a frame
} else {
if (lStart >= 0 && pos < lMaxFrameSize) {
lBuff[pos] = (byte) b;
}
pos++;
}
} catch (SocketTimeoutException ex) {
mLog.error("(timeout) "
+ ex.getClass().getSimpleName()
+ ": " + ex.getMessage());
mCloseReason = CloseReason.TIMEOUT;
mIsRunning = false;
} catch (Exception ex) {
mLog.error("(other) "
+ ex.getClass().getSimpleName()
+ ": " + ex.getMessage());
mCloseReason = CloseReason.SERVER;
mIsRunning = false;
}
}
// call client stopped method of engine
// (e.g. to release client from streams)
engine.connectorStopped(connector, mCloseReason);
// br.close();
mIn.close();
mOut.close();
mClientSocket.close();