package model; import java.awt.Color; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; import model.state.PlayState; public class NetworkConnection { private static final int port = 1234; private static final String address = "localhost"; private DataOutputStream dout; private DataInputStream din; private Thread receivethread; private PlayState play; public NetworkConnection(PlayState play) { this.play = play; } public void connect(String name) throws UnknownHostException, IOException { if (checkConnection()) { throw new IOException("Already connected!"); } Socket server = new Socket(address, port); dout = new DataOutputStream(server.getOutputStream()); din = new DataInputStream(server.getInputStream()); dout.writeUTF(name); receivethread = new Thread(new Runnable() { @Override public void run() { while (true) { receiveMessage(); } } }); receivethread.start(); } public boolean checkConnection() { if (dout == null) return false; try { dout.write(0); } catch (IOException e) { return false; } return true; } private void receiveMessage() { try { String message = din.readUTF(); String[] messagesplit = message.split("\\|"); // 2 switch (messagesplit[0]) { case "1": // New Match play.newMatch(messagesplit[1], messagesplit[2]); break; case "2": // Update message messagesplit = message.split(","); String[] playersplit = messagesplit[0].split("\\|"); play.updatePlayerInfo(Integer.parseInt(playersplit[1]), Integer.parseInt(playersplit[2]), Integer.parseInt(playersplit[3]), Integer.parseInt(playersplit[4]), play.getPlayer1()); play.updatePlayerInfo(Integer.parseInt(playersplit[5]), Integer.parseInt(playersplit[6]), Integer.parseInt(playersplit[7]), Integer.parseInt(playersplit[8]), play.getPlayer2()); String[] ballsplit = messagesplit[1].split("\\|"); if (ballsplit.length / 4 != play.getBalls().size()) { play.getBalls().clear(); } for (int i = 0; i < ballsplit.length / 4; i++) { play.getBall(i).updateInfo(Integer.parseInt(ballsplit[(i * 4) + 0]), Integer.parseInt(ballsplit[(i * 4) + 1]), Color.decode(ballsplit[(i * 4) + 3]), Integer.parseInt(ballsplit[(i * 4) + 2])); } String[] linesplit = messagesplit[2].split("\\|"); play.updateLines(Integer.parseInt(linesplit[0]), Integer.parseInt(linesplit[1]), Integer.parseInt(linesplit[2]), Integer.parseInt(linesplit[3]), Integer.parseInt(linesplit[4]), Integer.parseInt(linesplit[5])); play.setTimeleftpercent(Integer.parseInt(messagesplit[3])); } } catch (IOException e) { System.err.println("Connection to server closed"); receivethread.stop(); } } public void sendInput(int direction, int shoot) { sendMessage("1|" + direction + "|" + shoot); } private void sendMessage(String m) { try { dout.writeUTF(m); } catch (IOException e) { System.err.println("Connection to server closed"); } } public void close() { try { din.close(); dout.close(); } catch (IOException e) { } receivethread.stop(); } }