/** * @Communicator.java * * Sköter kommunikationen för Drawapplikationen * Skickar och tar emot via UDP. * * @Author: Karl-Adam karlsson * * @version 1.0 06/10/02 * * */ import java.util.LinkedList; import java.io.*; import java.net.*; import java.awt.*; import java.util.*; public class Communicator implements Runnable{ private int port; private int remotePort; InetAddress remAddress; private Paper myPaper; private DatagramSocket sendSock = null; private DatagramSocket getSock = null; private InetAddress server = null; /* * Konstruktor, fixar iordning sockets och allt som behövs för att UDP:a * @param String host, the Name of the host. * @param int aPort, The port on which to communicate * @param Draw aDrawApp An instance of the Draw application. * */ public Communicator(int aPort, Paper apaper, String remHost, int remPort, Paper ap){ remotePort = remPort; port = aPort; myPaper = ap; // Skapar sockets, en för send och end för receive. try { remAddress = InetAddress.getByName(remHost); sendSock = new DatagramSocket(); } catch (IOException exE) { System.err.println(exE); System.exit(1); } //// try { getSock = new DatagramSocket(aPort); } catch (IOException ex) { System.err.println(ex); System.exit(1); } }//End of Constructor /* * Skapar ett DataGramPacket av en Point p * och skickar iväg det hela. * @param Point p pointen som skall skickas */ public void packAndsend(Point p){ ByteArrayOutputStream byteStream = new ByteArrayOutputStream(1024); System.out.println("SENDING"); try { ObjectOutputStream outS = new ObjectOutputStream(new BufferedOutputStream(byteStream)); outS.flush(); outS.writeObject(p); outS.flush(); //Fixar byte array byte[] sendBuffer = byteStream.toByteArray(); DatagramPacket aPacket = new DatagramPacket(sendBuffer, sendBuffer.length, remAddress, remotePort); sendSock.send(aPacket); } catch (IOException ioex) { System.err.println(ioex); } } /* * Run, * tar emot ett DataGramPacket via getSock , gör om * till Object och anropar drawPoint hos MyPaper. * Sover 50ms varje loop. * */ public void run(){ DatagramPacket incoming; while (true) { byte[] buffer = new byte[1024]; incoming = new DatagramPacket(buffer, buffer.length); try { incoming.setLength(buffer.length); System.out.println("Receive"); getSock.receive(incoming); int byteCount = incoming.getLength(); ByteArrayInputStream byteStr = new ByteArrayInputStream(buffer); ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStr)); try{ Object o = is.readObject(); is.close(); System.out.println(o.toString()); myPaper.drawPoint((Point)o); }catch(ClassNotFoundException cE){System.err.println(cE);} } catch (IOException ex) { System.err.println("Exception: " + ex); ex.printStackTrace(); } try{ Thread.sleep(50); }catch(InterruptedException iEX){System.err.println(iEX);} } } }