import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;

class MessThread extends Thread {
  Socket mySocket;
  PrintStream myPrintStream;
  MessageList myList;
  int counter;
  String name;

  MessThread(Socket i,MessageList m,int c) { 
    mySocket=i;
    counter=c;
    myList=m;
  }

  public void run() {
    try {
      PrintStream myPrintStream=
        new PrintStream(mySocket.getOutputStream());
      DataInputStream in=new DataInputStream(mySocket.getInputStream());
      myList.p[myList.count++]=myPrintStream;
      myPrintStream.println("Welcome to Jeff's Message server");
      myPrintStream.println("Please enter your name:");
      name=in.readLine();
      myPrintStream.println("Thank you "+name+".");

      boolean done=false;
      while(!done) {
        String str=in.readLine();
        if(str==null)
          done=true;
        else if(str.trim().equals("exit"))
          done=true;
        else {
          myList.send(name,str,myPrintStream);
        }
      }
      mySocket.close();
System.out.println("closing:"+counter);
    }
    catch(Exception e) {
      System.out.println(e);
    }
  }
}

class MessageList {
  public int count;
  public PrintStream[] p;
 
  MessageList() {
    p=new PrintStream[10];
  }

  public void send(String n,String s,PrintStream ps) {
    for(int i=0;i<count;i++) {
      if(p[i]!=null && p[i]!=ps) {
        try {
          p[i].println(n+":"+s);
        }
        catch(Exception e) {
          for(int j=i+1;j<count;j++) {
            p[j-1]=p[j];
          }
          count--;
        }
      }
    }
  }

}

class MessageServer {
  public static void main(String[] args) {
    int i=1;
    MessageList myList=new MessageList();
    try {
      ServerSocket s=new ServerSocket(7500);
      while(true) {
        Socket aSocket=s.accept();
        System.out.println("starting "+i);
        new MessThread(aSocket,myList,i).start();
        i++;
      }
    }
    catch (Exception e) {
      System.out.println(e);
    }
  }
}

