package fr.umlv.ji.tcp.server;
import java.net.*;
import javax.net.*;
import java.io.*;
import java.util.logging.*;
import java.util.prefs.*;
public class BoundConcurrent extends Server {
protected int threadNb = -1;
public BoundConcurrent(Logger log, Preferences prefs) {
super(log,prefs);
}
public void setThreadNumber(int nb) {
threadNb = nb;
}
public void launch() {
try {
bind();
} catch (IOException e) {
logger.log(Level.SEVERE,"bind",e);
return;
}
if (threadNb==-1)
threadNb = getPreferences().getInt("threadNB",10);
ThreadGroup group = new ThreadGroup("Service");
for (int i=0; i<threadNb; i++) {
String name = "pl"+i;
try {
Thread t = new Thread(group,new RunnableService(),name);
t.start();
} catch (NullPointerException e) {
logger.log(Level.SEVERE,"No service available",e);
break;
}
}
if (group.activeCount()!=0)
logger.info("Number of threads: " +group.activeCount());
}
class RunnableService implements Runnable {
public void run() {
Socket serviceSocket;
while (true) {
synchronized (serverSocket) {
try {
serviceSocket = serverSocket.accept();
} catch (IOException e) {
logger.log(Level.SEVERE,"Accept",e);
break;
}
}
try {
logger.info(Thread.currentThread().getName() +
" traite le service " +
service.getClass().getName());
service.serve(serviceSocket);
serviceSocket.close();
} catch (IOException e) {
logger.log(Level.WARNING,e.toString());
}
}
}
}
}