/**
* license (MIT) Copyright Nubisa Inc. 2014
*/
package jxm;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
public class SocketReceiver
extends Thread {
private SocketEvents events = null;
private InputStream input = null;
private volatile boolean stop = false;
private Socketer websocket = null;
public SocketReceiver(InputStream input, Socketer websocket) {
this.input = input;
this.websocket = websocket;
this.events = websocket.events;
}
private String getText(Byte[] message) {
int ln = message.length;
byte[] mess = new byte[ln];
for (int i = 0; i < ln; i++)
mess[i] = message[i];
try {
return new String(mess, "UTF-8");
} catch (UnsupportedEncodingException uee) {
return null;
}
}
private void handleError(Exception e) {
dismiss();
//websocket.receiveError(e);
}
public boolean isRunning() {
return !stop;
}
public void run() {
boolean frameStart = false;
List<Byte> messageBytes = new ArrayList<Byte>();
while (!stop) {
try {
int b = input.read();
if (b == 0x00) {
frameStart = true;
} else if (b == 0xff && frameStart == true) {
frameStart = false;
Byte[] message = messageBytes.toArray(new Byte[messageBytes.size()]);
events.message(getText(message));
messageBytes.clear();
} else if (frameStart) {
messageBytes.add((byte) b);
} else if (b == -1) {
handleError(new Exception("no data received from socket"));
}
} catch (IOException e) {
handleError(e);
}
}
handleError(new Exception("Socket receiver exited."));
}
public void dismiss() {
stop = true;
}
}