package server; import java.io.*; import java.net.*; import client.MessageWrapper; import util.EventProtocol; import util.Logger; public class Server extends Thread { private ServerSocket ss; public static void main(String[] args) { Server si = new Server(); si.start(); } public Server() { int port = 30000; try { ss = new ServerSocket(port); System.out.println(InetAddress.getLocalHost().getHostAddress()); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { Logger.log("Server started"); Socket connection; Statebox mb = new Statebox(); UpdateToClient rt = new UpdateToClient(mb); rt.start(); while (true) { try { connection = ss.accept(); new PlayerParticipant(connection, mb).start(); rt.addSocket(connection); } catch (IOException ioe) { ioe.printStackTrace(); } } } } class UpdateToClient extends Thread { private Statebox statebox; private byte[] msg; public UpdateToClient(Statebox statebox) { this.statebox = statebox; } // TODO: (re)move this method public void addSocket(Socket s) { if (statebox.getCurrentClients() >= 4) { try { s.close(); } catch (IOException e) { e.printStackTrace(); } return; } statebox.addClient(s); Logger.log("Sending local player init id"); byte[] msg = { EventProtocol.LOCAL_PLAYER_INIT }; byte[] idMessage = MessageWrapper.wrapMessageToServer(msg, (byte) statebox.getCurrentClients()); try { sendMessage(idMessage, s.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } private void sendMessage(byte[] msg, OutputStream writer) throws IOException { writer.write(msg); writer.flush(); } @Override public void run() { while (true) { msg = this.statebox.readMessage(); int id = (int) msg[5]; for (Socket s : statebox.getClientSockets(id)) { if (s.isClosed()) { statebox.removeClientSocket(s); } else { try { sendMessage(msg, s.getOutputStream()); } catch (IOException ioe) { Logger.log("Couldn't send message"); } } } } } }