/** * Connection.java * * @author LS PI4 * * @version $Id$ * */ import java.io.*; import java.net.*; import java.util.*; /** * Objekte dieser Klasse verwalten eine Verbindung zu genau einem Client. * Die interne Klasse SocketHandler implementiert einen Thread, der in * einer Endlosschleife Kommandos vom Client entgegennimmt und abarbeitet. * Gegenwärtig kennt die Klasse die Befehle "get", "put", und "dir". * * "get": Get sucht ein Objekt im Repository. Der Befehl erwartet als * Parameter einen String, der als hash key verwendet wird. * * "put": Put legt ein Objekt im Repository ab. Der Befehl erwartet als * Parameter das abzulegende Objekt. * * "dir": Der Befehl gibt eine Liste der hash keys (also eine Liste von * Strings) zurueck. * * @author PI4 * @version $Id$ */ public class Connection { /** * Dieser Thread bearbeitet in einer Endlosschleife die Befehle des * Clients. */ class SocketHandler implements Runnable { public void run() { try { while (true) { String cmd = (String) ois.readObject(); System.out.println("cmd= \"" + cmd + "\""); if ( cmd.equals("get") ) { String key= (String) ois.readObject(); Object value= objectRepository.get(key); oos.writeObject(value); } else if ( cmd.equals("put") ) { Object value= ois.readObject(); String key = value.toString(); objectRepository.put(key, value); } else if ( cmd.equals("dir") ) { Vector keys= new Vector(); Iterator it= objectRepository.values().iterator(); while ( it.hasNext() ) { String key= it.next().toString(); keys.add(key); } oos.writeObject(keys); } } } catch (IOException e) { } catch (ClassNotFoundException e) { System.err.println("Class not found while reading from input stream"); } } } private Socket sock; /** * ObjectStreams werden zum Serialisieren von Objekten verwendet. * Mit Hilfe der Methoden writeObject bzw. readObject werden die * zu versendenden Objekte serialisiert. */ private ObjectOutputStream oos; private ObjectInputStream ois; private HashMap objectRepository; private SocketHandler socketHandler; private Thread socketHandlerThread; public Connection(Socket sock, HashMap objectRepository) { this.sock = sock; try { this.oos = new ObjectOutputStream( sock.getOutputStream() ); this.ois = new ObjectInputStream ( sock.getInputStream() ); } catch (IOException e) { System.err.println("IO exception while creating object streams"); } this.objectRepository = objectRepository; this.socketHandler = new SocketHandler(); this.socketHandlerThread= new Thread(socketHandler); this.socketHandlerThread.start(); } }