annotate src/luan/webserver/Server.java @ 1142:0f59eab45f3d

webserver - threading
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 30 Jan 2018 18:02:47 -0700
parents 4189027691b7
children d6d0bd05ad8c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1137
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
1 package luan.webserver;
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
2
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
3 import java.io.IOException;
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
4 import java.net.Socket;
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
5 import java.net.ServerSocket;
1142
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
6 import java.util.concurrent.ExecutorService;
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
7 import java.util.concurrent.Executors;
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
8 import java.util.concurrent.TimeUnit;
1137
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
9 import org.slf4j.Logger;
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
10 import org.slf4j.LoggerFactory;
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
11
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
12
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
13 public class Server {
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
14 private static final Logger logger = LoggerFactory.getLogger(Server.class);
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
15
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
16 public final int port;
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
17 public final Handler handler;
1142
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
18 private static final ExecutorService exec = Executors.newCachedThreadPool();
1137
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
19
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
20 public Server(int port,Handler handler) {
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
21 this.port = port;
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
22 this.handler = handler;
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
23 }
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
24
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
25 protected ServerSocket newServerSocket() throws IOException {
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
26 return new ServerSocket(port);
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
27 }
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
28
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
29 public synchronized void start() throws IOException {
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
30 final ServerSocket ss = newServerSocket();
1142
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
31 exec.execute(new Runnable(){public void run() {
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
32 try {
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
33 while(!exec.isShutdown()) {
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
34 final Socket socket = ss.accept();
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
35 exec.execute(new Runnable(){public void run() {
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
36 Connection.handle(Server.this,socket);
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
37 }});
1137
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
38 }
1142
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
39 } catch(IOException e) {
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
40 logger.error("",e);
1137
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
41 }
1142
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
42 }});
1137
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
43 logger.info("started server on port "+port);
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
44 }
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
45
1142
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
46 public synchronized boolean stop(long timeoutSeconds) {
1137
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
47 try {
1142
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
48 exec.shutdownNow();
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
49 boolean stopped = exec.awaitTermination(timeoutSeconds,TimeUnit.SECONDS);
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
50 if(stopped)
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
51 logger.info("stopped server on port "+port);
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
52 else
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
53 logger.warn("couldn't stop server on port "+port);
0f59eab45f3d webserver - threading
Franklin Schmidt <fschmidt@gmail.com>
parents: 1138
diff changeset
54 return stopped;
1137
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
55 } catch(InterruptedException e) {
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
56 throw new RuntimeException(e);
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
57 }
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
58 }
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
59
c123ee15f99b add webserver
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff changeset
60 }