package no.ntnu.fp.net.network.server; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.HashMap; import java.util.Map; import java.util.Queue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingDeque; import no.ntnu.fp.net.network.Tuple; public class ClientHandler implements Runnable { //Fields private Socket mySocket; private Queue<Tuple <Socket, Object>> inQueue; //private DataOutputStream os; private Map<String, Socket> clients; //private DataInputStream is; //private ObjectInputStream ios; //Receive messages from the clients //Need some request queue, blocked queue public ClientHandler(Socket socket, Queue<Tuple <Socket, Object>> inQueue, Map<String, Socket> clients){ this.mySocket = socket; this.inQueue = inQueue; this.clients = clients; } /** * Read objects and put them in the queue * **/ @Override public void run() { boolean running = true; while(running){ try { DataInputStream is = new DataInputStream(mySocket.getInputStream()); ObjectInputStream ios = new ObjectInputStream(is); Object obj = ios.readObject(); ((LinkedBlockingDeque)inQueue).putFirst(new Tuple(mySocket, obj)); System.out.println("Got data"); } catch (IOException e) { System.out.println("A client closed the connection"); //TODO: remove user from auth cache for (Map.Entry<String, Socket> entry : clients.entrySet()) { if (entry.getValue() == mySocket) { clients.remove(entry.getKey()); continue; } } running = false; } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }