import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.net.*; import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; public class Client extends UnicastRemoteObject implements RemoteClient { public static void main(String[] args) throws RemoteException { new Client(args[0]); } public Client(String host) throws RemoteException { String url = "rmi://" + host + "/"; try { // Gör dig tillgänglig utåt if(host.equals("localhost")) { // Servern har redan startat rmiregistryt LocateRegistry.getRegistry(1099); } else { LocateRegistry.createRegistry(1099); } Naming.rebind("client_callbacks", this); System.out.println("Client bound"); // Fixa en referens till servern RemoteServer remoteServer = (RemoteServer)Naming.lookup(url + "server_callbacks"); // Register with the server String clientHost = InetAddress.getLocalHost().getHostAddress(); remoteServer.registerClient(clientHost); // Dra igång visningen new ClientGUI(remoteServer); } catch(Exception e) { System.out.println("Exception generated: "+ e.getMessage()); } } public void showServerClients(String message) throws RemoteException { System.out.println(message); } } class ClientGUI extends JFrame implements Runnable { RemoteServer remoteServer = null; Vector ballsRaw = new Vector(); Thread thread = new Thread(this); int xLim = 500, yLim = 500, rMax = 70; public ClientGUI(RemoteServer remoteServer) { this.remoteServer = remoteServer; setSize(xLim, yLim); setVisible(true); addKeyListener(new L()); thread.start(); } public void run() { while(true) { // Hämtar först till en tmp-vektor för att slippa blinkandet Vector ballsRawTmp = null; try { ballsRawTmp = remoteServer.getBalls(); } catch(RemoteException re) { System.out.println("Exception generated: " + re.getMessage()); } Graphics g = getGraphics(); g.setColor(getBackground()); for(int i = 0; i < ballsRaw.size(); i = i + 3) { int x = (Integer)ballsRaw.elementAt(i); int y = (Integer)ballsRaw.elementAt(i + 1); int r = (Integer)ballsRaw.elementAt(i + 2); g.fillOval(x, y, r, r); } ballsRaw = ballsRawTmp; for(int i = 0; i < ballsRaw.size(); i = i + 3) { int x = (Integer)ballsRaw.elementAt(i); int y = (Integer)ballsRaw.elementAt(i + 1); int r = (Integer)ballsRaw.elementAt(i + 2); int blue = r * 255 / rMax; if(blue > 255) blue = 255; if(blue < 0) blue = 0; g.setColor(new Color(0, 0, blue)); g.fillOval(x, y, r, r); } setTitle("Antal bollar: " + ballsRaw.size() / 3); try { thread.sleep(50); } catch(Exception e) {} } } class L extends KeyAdapter { public void keyPressed(KeyEvent e) { try { if(e.getKeyChar() == '+') remoteServer.addBall(); if(e.getKeyChar() == 'p') remoteServer.pauseBalls(); if(e.getKeyChar() == 'e') { String clientHost = InetAddress.getLocalHost().getHostAddress(); remoteServer.unregisterClient(clientHost); System.exit(1); } } catch(Exception ee) { System.out.println("Exception generated: " + ee.getMessage()); } } } }