import java.net.ServerSocket;
import java.net.Socket;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import java.io.IOException;

public class ObjectServer implements Runnable{
  
  public static void main (String [] args) {
    Thread t = new Thread(new ObjectServer());
    t.setPriority(4);
    t.start();
  }
  
  public void run() {
    try {
      System.out.println("Initializing");
      ServerSocket serv = new ServerSocket(2513);
      System.out.println("Server listening on port 2513");
      while (true) {
        Socket client = serv.accept();
        System.out.println("new Client from: "+client);
        new ObjectClientThread(client).start();
      }
    } catch (IOException e) {
      System.err.println(e);
    }
  }
  
}

class ObjectClientThread extends Thread {
  
  ObjectOutputStream oos;
  ObjectInputStream ois;
  Socket client;
  
  ObjectClientThread (Socket client) {
    this.client=client;
    try {
      ois = new ObjectInputStream(client.getInputStream());    
      oos = new ObjectOutputStream(client.getOutputStream());
    } catch (IOException iox) {
      System.err.println(iox);
    }
  }
  
  public void run() {
    while (true) {
      try {
        Object o = ois.readObject();
        System.out.println("> "+client+" got "+o);
        if (o instanceof Job) {
          Job j = (Job) o;
          j.doCalculate();
          oos.writeObject(j);
          System.out.println("< "+client+" writing "+j);
        }
      } catch (IOException e) {
        System.err.println(e);
        stop();
      } catch (ClassNotFoundException e) {
        System.err.println(e);
      }
    }
  }
}
  

