/** *SocketConnection.java */ package gameFrameWork.communicationcontrol; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class SocketConnection implements Connection, Runnable{ //the port we gonna connect to //this port must be open //we should get this port from a config file/ as argument int inputport; int outputport; //inputstream InputStream is; //outputstream OutputStream os; //the inetaddress we are connected to InetAddress inetaddress; BufferedReader reader; MessageHandler handler; boolean run; //thread Thread t; /** * constructor * this constructor will wait till a client connection is made to this socket * @param inetaddress the inetaddress this connection should connecto to * @param handler the messagehanlder this connection should report to * @param inputport the port used for input * @param outputport the port used for output * @throws IOException */ public SocketConnection(MessageHandler handler, InetAddress ip,int inputport,int outputport) throws IOException { System.out.println("starting socketconnection"); this.handler = handler; this.inetaddress = inetaddress; inputport = inputport; outputport = outputport; run = true; t = new Thread(this); t.start(); System.out.println("thread started, sleeping 10 seconds"); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("sleep failed"); e.printStackTrace(); } System.out.println("done with sleeping, "); System.out.println("making new outputsocket"); os = new Socket(ip,outputport).getOutputStream(); System.out.println("done: socketconnection"); } /** * @return the inputstream of this connection */ public InputStream getInputStream( ){ return is; } /** * @return the outputstream of this connection */ public OutputStream getOutputStream( ){ return os; } public InetAddress getIp() { return inetaddress; } /** * is this really needed? */ public void setIp(InetAddress ip) { if(!this.inetaddress.equals(ip)){ throw new UnsupportedOperationException("not implemented yet"); } } public void run() { System.out.println("run started"); //open the serversocket ServerSocket serversocket = null; Socket socket = null; try { serversocket = new ServerSocket(inputport); System.out.println("serversocket made"); System.out.println("serversocket is boud:" + serversocket.isBound()); try { //getting a connectiong (this can take some time) socket = serversocket.accept(); System.out.println("serversocket caught something"); try { //get thie inputstream from the socket is = socket.getInputStream(); //make the bufferedreader reader = new BufferedReader(new InputStreamReader(is)); //listen to reader, and call handler.messageRecieved if something comes up while (run){ try { System.out.println("socket caught something, calling messagerecieved"); handler.messageReceived(reader.readLine()); } catch (IOException e) { System.out.println("IOError in readerlistener\nThis should be a feature, not a bug"); System.out.println("closing socket"); run = false; } } } catch (IOException e1) { System.out.println("IOError when getting inputstream from clientsocket"); System.out.println("closing socket"); e1.printStackTrace(); } } catch (IOException e1) { System.out.println("IOError when getting clientsocket from serversocket"); System.out.println("closing socket"); e1.printStackTrace(); } } catch (IOException e1) { // TODO wat doen we met erros? handler verwittigen? System.out.println("IOError when setting up serversocket; "); System.out.println("closing socket"); e1.printStackTrace(); }finally{ //try to close the sockets try { serversocket.close(); socket.close(); } catch (IOException e) { //do nothing } } System.out.println("run: done"); } /** * requests a stop * don't know if this will actually work * but we can always stop the runnable if we close the connection, * and we will get an IOExeption in the run */ public void requestStop(){ run = false; } }