/** * @ioHandler.java * * Klass som hanterar trafiken, * skickar och ytar emot meddelanden. * * @author Karl-Adam Karlsson * @version 1.0 06/10/01 * * */ import java.util.LinkedList; import java.io.*; import java.net.*; import java.awt.*; import java.util.*; public class ioHandler implements Runnable{ private int port; private int remPort; private DatagramSocket sendSock = null; private DatagramSocket getSock = null; //private InetAddress server = null; public LinkedList clients; CryptHandler myCryptHandler; ClientUI myChat; /* * Konstruktor, fixar iordning sockets och allt som behövs för att UDP:a * */ public ioHandler(ClientUI aChat, String keypath){ remPort = 2345; port = 2345; myChat = aChat; clients = new LinkedList(); myCryptHandler = new CryptHandler(keypath); // 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(port); } catch (IOException ex) { System.err.println(ex); System.exit(1); } }//End of Constructor /* * Anropas när man vill skicka meddelande, skickar det. * */ public void sendMess(Message aMess){ ByteArrayOutputStream byteStream = new ByteArrayOutputStream(1024); //System.out.println("MESSAGE TYPE: " + aMess.type()); try { ObjectOutputStream outS = new ObjectOutputStream(new BufferedOutputStream(byteStream)); //KRYPTERA DATAT, dvs textsträngen if(aMess.type()==Message.MESSAGE_MESSAGE){ aMess.setText( myCryptHandler.encrypt(aMess.getText()) ); } outS.flush(); outS.writeObject(aMess); outS.flush(); if(aMess.type()==Message.MESSAGE_MESSAGE||aMess.type()==Message.MESSAGE_DISCONNECT){ // Detta skall skickas till alla som e connected. //System.out.println("NOCLIENTS: " +clients.size()); for(int i=0;i " + aClient.getName() +" has connected to the chat."); myChat.addUser(aClient); clients.removeFirst(); }else if(mess.type()==Message.MESSAGE_DISCONNECT){ //Hitta rätt person i clients, ta bort, och // ta sedan bort rätt nick från listan i Client UI. for(int no=0;no " + ((Client)clients.get(no)).getName() +" disconnected."); myChat.remUser(((Client)clients.get(no)).getName()); clients.remove(no); } } }else if(mess.type()==Message.MESSAGE_CHALLENGE){ //VI FICK EN UTMANING myChat.printMessage(" "+"Received Challenge from " + mess.getText()+"."); myChat.createGameDialogue(mess); }else if(mess.type()==Message.MESSAGE_CH_REPLY){ //VI FICK SVAR PÅ EN UTMANING String s = (String)mess.getData(); if(s.equals("OK") ){ myChat.printMessage(" " + mess.getText() +" accepted our challenge."); new Draw(1, mess.getSenderIP().getHostAddress() ,myChat); } else{ myChat.printMessage(" " + mess.getText() +" rejected our challenge."); } }else if(mess.type()==Message.MESSAGE_USR_LIST){ System.out.println("RECEIVED USR LIST"); if(myChat.me.firstConnect){ //Om detta e den 1a listan vi får skall vi connecta till alla. LinkedList aList = (LinkedList)mess.getData(); Client aclient; while (aList.size()>0){ aclient = (Client)aList.getFirst(); System.out.println("ADDING CLIENT NAMED: " +aclient.getName()); clients.addLast(aclient); myChat.addUser(aclient); if(!aclient.getAddress().equals(mess.getSenderIP()) && !aclient.getAddress().equals(myChat.me.getAddress()) ){ // Den första e personen som skickade listan // honom har vi connectat till // Resten skall vi också connecta till. Message aMessage = new Message(Message.MESSAGE_CONNECT); aMessage.setData(myChat.me.getName(), myChat.me.getAddress(), aclient.getAddress() ); sendMess(aMessage); } aList.removeFirst(); } myChat.me.firstConnect=false; } //Annars inget } }catch(ClassNotFoundException cE){System.err.println(cE);} } catch (IOException ex) { System.err.println("Exception: " + ex); ex.printStackTrace(); } try{ Thread.sleep(30); }catch(InterruptedException iEX){System.err.println(iEX);} } } }