Вот как сделано у меня, и все прекрасно работает(правда с уверенностью могу сказать только про GET запросы)
public class TinyHttpd extends Thread {
public static Logger log = Logger.getLogger(TinyHttpd.class.getName());
static StatusController statusController;
@Inject
public TinyHttpd(StatusController statusControllerNew) {
super("TinyHttpd");
statusController = statusControllerNew;
}
private volatile boolean active = true;
private ServerSocket ss;
public void deactivate() {
active = false;
try {
ss.close();
} catch (IOException e) {
log.error(e);
}
}
public void run() {
try {
ss = new ServerSocket();
SocketAddress address = new InetSocketAddress("0.0.0.0", 8080);
ss.bind(address);
log.info("Start TinyHttpd");
while (active) {
new TinyHttpdConnection(ss.accept()).start();
log.debug("new connection");
}
} catch (IOException e) {
log.error(e);
}
log.info("Stopping TinyHttpd");
}
}
class TinyHttpdConnection extends Thread {
private static int threadNum = 0;
Socket client;
TinyHttpdConnection(Socket client) throws SocketException {
super("TinyHttpdConnection-" + ++threadNum);
this.client = client;
setPriority(NORM_PRIORITY - 1);
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
client.getInputStream(), "8859_1"));
OutputStream out = client.getOutputStream();
PrintWriter pout = new PrintWriter(new OutputStreamWriter(out,
"8859_1"), true);
String request = in.readLine();
TinyHttpd.log.debug("Request: " + request);
StringTokenizer st = new StringTokenizer(request);
if ((st.countTokens() >= 2) && st.nextToken().equals("GET")) {
request = st.nextToken();
//тут логика и анализ токенов
} else {
pout.println("400 Bad Request");
}
} else {
pout.println("400 Bad Request");
}
client.close();
} catch (IOException e) {
System.out.println("I/O error " + e);
}
}
}
Так же обратите внимание на то, что после после socket.accept() создается новый поток. Я бы очень рекомендовал так делать, что бы одновременно все-же могли обрабатываться более одного клиента.