-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathWebWorker.java
More file actions
124 lines (115 loc) · 3.9 KB
/
WebWorker.java
File metadata and controls
124 lines (115 loc) · 3.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/**
* Web worker: an object of this class executes in its own new thread
* to receive and respond to a single HTTP request. After the constructor
* the object executes on its "run" method, and leaves when it is done.
*
* One WebWorker object is only responsible for one client connection.
* This code uses Java threads to parallelize the handling of clients:
* each WebWorker runs in its own thread. This means that you can essentially
* just think about what is happening on one client at a time, ignoring
* the fact that the entirety of the webserver execution might be handling
* other clients, too.
*
* This WebWorker class (i.e., an object of this class) is where all the
* client interaction is done. The "run()" method is the beginning -- think
* of it as the "main()" for a client interaction. It does three things in
* a row, invoking three methods in this class: it reads the incoming HTTP
* request; it writes out an HTTP header to begin its response, and then it
* writes out some HTML content for the response content. HTTP requests and
* responses are just lines of text (in a very particular format).
*
**/
import java.net.Socket;
import java.lang.Runnable;
import java.io.*;
import java.util.Date;
import java.text.DateFormat;
import java.util.TimeZone;
public class WebWorker implements Runnable
{
private Socket socket;
/**
* Constructor: must have a valid open socket
**/
public WebWorker(Socket s)
{
socket = s;
}
/**
* Worker thread starting point. Each worker handles just one HTTP
* request and then returns, which destroys the thread. This method
* assumes that whoever created the worker created it with a valid
* open socket object.
**/
public void run()
{
System.err.println("Handling connection...");
try {
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
readHTTPRequest(is);
writeHTTPHeader(os,"text/html");
writeContent(os);
os.flush();
socket.close();
} catch (Exception e) {
System.err.println("Output error: "+e);
}
System.err.println("Done handling connection.");
return;
}
/**
* Read the HTTP request header.
**/
private void readHTTPRequest(InputStream is)
{
String line;
BufferedReader r = new BufferedReader(new InputStreamReader(is));
while (true) {
try {
while (!r.ready()) Thread.sleep(1);
line = r.readLine();
System.err.println("Request line: ("+line+")");
if (line.length()==0) break;
} catch (Exception e) {
System.err.println("Request error: "+e);
break;
}
}
return;
}
/**
* Write the HTTP header lines to the client network connection.
* @param os is the OutputStream object to write to
* @param contentType is the string MIME content type (e.g. "text/html")
**/
private void writeHTTPHeader(OutputStream os, String contentType) throws Exception
{
Date d = new Date();
DateFormat df = DateFormat.getDateTimeInstance();
df.setTimeZone(TimeZone.getTimeZone("GMT"));
os.write("HTTP/1.1 200 OK\n".getBytes());
os.write("Date: ".getBytes());
os.write((df.format(d)).getBytes());
os.write("\n".getBytes());
os.write("Server: Jon's very own server\n".getBytes());
//os.write("Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT\n".getBytes());
//os.write("Content-Length: 438\n".getBytes());
os.write("Connection: close\n".getBytes());
os.write("Content-Type: ".getBytes());
os.write(contentType.getBytes());
os.write("\n\n".getBytes()); // HTTP header ends with 2 newlines
return;
}
/**
* Write the data content to the client network connection. This MUST
* be done after the HTTP header has been written out.
* @param os is the OutputStream object to write to
**/
private void writeContent(OutputStream os) throws Exception
{
os.write("<html><head></head><body>\n".getBytes());
os.write("<h3>My web server works!</h3>\n".getBytes());
os.write("</body></html>\n".getBytes());
}
} // end class