package server;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.nio.ByteBuffer;
import client.MessageWrapper;
import util.EventProtocol;
import util.Logger;
public class PlayerParticipant extends Thread {
private InputStream input;
private Socket socket;
private Statebox stateBox;
public PlayerParticipant(Socket socket, Statebox stateBox) {
try {
this.socket = socket;
this.stateBox = stateBox;
input = socket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
byte id = -1;
while(!socket.isClosed()){
try {
byte[] intBytes = new byte[4];
for(int i = 0; i < 4; i++){
intBytes[i] = (byte) input.read();
}
int msgLen = ByteBuffer.wrap(intBytes).asIntBuffer().get();
byte[] msg = new byte[msgLen+4];
for(int i = 0; i < 4; i++){
msg[i] = intBytes[i];
}
for(int i = 4; i < msg.length; i++){
msg[i] = (byte) input.read();
}
id = msg[5];
stateBox.writeMessage(msg);
} catch(ArrayIndexOutOfBoundsException aioobe){
Logger.log("Message not complete.");
closeConnection();
} catch (Exception e) {
Logger.log(e.getMessage());
closeConnection();
}
}
stateBox.removeClientSocket(socket);
if(id > -1){
Logger.log("Sending player lost connection");
byte[] closingMsg = new byte[1];
closingMsg[0] = EventProtocol.PLAYER_LOST_CONNECTION;
stateBox.writeMessage(MessageWrapper.wrapMessageToServer(closingMsg, id));
}
}
private void closeConnection(){
try {
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}