-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main.java
198 lines (173 loc) · 6.35 KB
/
Main.java
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import java.net.*;
import java.io.*;
import java.util.Date;
import java.awt.Desktop;
import java.net.URI;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Calendar;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;
class Main {
static int clientCounter = 0;
static int marioX = 100;
static int marioY = 100;
static int yoshiX = 200;
static int yoshiY = 100;
static boolean createYoshi = false;
static String getServerTime() {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
return dateFormat.format(calendar.getTime());
}
static void sendLine(PrintWriter out, String line) {
out.print(line); // Send over the socket
out.print("\r\n");
System.out.println(line); // Print it to the console too, just to make debugging easier
}
static void onGet(OutputStream os, String url) throws Exception {
PrintWriter out = new PrintWriter(os, true);
String filename = url.substring(1); // cut off the initial "/"
File f = new File(filename);
Path path = Paths.get(filename);
String dateString = getServerTime();
System.out.println("----------The server replied: ----------");
if (f.exists() && !f.isDirectory()) {
// Read the file from disk
byte[] fileContents = Files.readAllBytes(path);
// Send the headers
sendLine(out, "HTTP/1.1 200 OK");
sendLine(out, "Content-Type: " + Files.probeContentType(path));
sendLine(out, "Content-Length: " + Integer.toString(fileContents.length));
sendLine(out, "Date: " + dateString);
sendLine(out, "Last-Modified: " + dateString);
sendLine(out, "Connection: close");
sendLine(out, "");
out.flush();
// Send the payload
os.write(fileContents);
String blobHead = fileContents.length < 60 ? new String(fileContents)
: new String(fileContents, 0, 60) + "...";
System.out.println(blobHead);
} else {
// Make an error message
String payload = "404 - File not found: " + filename;
// Send HTTP headers
sendLine(out, "HTTP/1.1 200 OK");
sendLine(out, "Content-Type: text/html");
sendLine(out, "Content-Length: " + Integer.toString(payload.length()));
sendLine(out, "Date: " + dateString);
sendLine(out, "Last-Modified: " + dateString);
sendLine(out, "Connection: close");
sendLine(out, "");
// Send the payload
sendLine(out, payload);
}
}
static void onPost(OutputStream os, String url, char[] incomingPayload) {
// Parse the incoming payload
System.out.println("----------------------------------------");
String payload = String.valueOf(incomingPayload);
System.out.println("Received the following payload: " + payload);
Json incoming = Json.parse(payload);
// Make a response
Json outgoing = Json.newObject();
int clientID = (int) incoming.getLong("id");
if (clientID < 0) {
outgoing.add("id", clientCounter);
if (clientCounter == 1) {
createYoshi = true;
}
clientCounter++;
} else {
outgoing.add("id", clientID);
}
if (clientID == 0) {
marioX = (int) incoming.getLong("marioX");
marioY = (int) incoming.getLong("marioY");
} else if (clientID == 1) {
yoshiX = (int) incoming.getLong("yoshiX");
yoshiY = (int) incoming.getLong("yoshiY");
}
outgoing.add("createYoshi", createYoshi);
outgoing.add("marioX", marioX);
outgoing.add("marioY", marioY);
if (clientCounter > 1) {
outgoing.add("yoshiX", yoshiX);
outgoing.add("yoshiY", yoshiY);
}
String response = outgoing.toString();
// Send HTTP headers
System.out.println("----------The server replied: ----------");
String dateString = getServerTime();
PrintWriter out = new PrintWriter(os, true);
sendLine(out, "HTTP/1.1 200 OK");
sendLine(out, "Content-Type: application/json");
sendLine(out, "Content-Length: " + Integer.toString(response.length()));
sendLine(out, "Date: " + dateString);
sendLine(out, "Last-Modified: " + dateString);
sendLine(out, "Connection: close");
sendLine(out, "");
// Send the response
sendLine(out, response);
out.flush();
}
public static void main(String[] args) throws Exception {
// Make a socket to listen for clients
int port = 3000;
String urlName = "/page.html";
String ServerURL = "http://localhost:" + Integer.toString(port) + urlName;
ServerSocket serverSocket = new ServerSocket(port);
// Start the web browser
if (Desktop.isDesktopSupported()) {
Desktop.getDesktop().browse(new URI(ServerURL));
Desktop.getDesktop().browse(new URI(ServerURL));
} else
System.out.println("Please direct your browser to " + ServerURL);
// Handle requests from clients
while (true) {
Socket clientSocket = serverSocket.accept(); // This call blocks until a client connects
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
OutputStream os = clientSocket.getOutputStream();
// Read the HTTP headers
String headerLine;
int requestType = 0;
int contentLength = 0;
String url = "";
System.out.println("----------A client said: ----------");
while ((headerLine = in.readLine()) != null) {
System.out.println(headerLine);
if (headerLine.length() > 3 && headerLine.substring(0, 4).equals("GET ")) {
requestType = 1;
url = headerLine.substring(4, headerLine.indexOf(" ", 4));
} else if (headerLine.length() > 4 && headerLine.substring(0, 5).equals("POST ")) {
requestType = 2;
url = headerLine.substring(5, headerLine.indexOf(" ", 5));
} else if (headerLine.length() > 15 && headerLine.substring(0, 16).equals("Content-Length: "))
contentLength = Integer.parseInt(headerLine.substring(16));
if (headerLine.length() < 2) // Headers are terminated by a "\r\n" line
break;
}
// Send a response
if (requestType == 1) {
onGet(os, url);
} else if (requestType == 2) {
// Read the incoming payload
char[] incomingPayload = new char[contentLength];
in.read(incomingPayload, 0, contentLength);
String blobHead = incomingPayload.length < 60 ? new String(incomingPayload)
: new String(incomingPayload, 0, 60) + "...";
System.out.println(blobHead);
onPost(os, url, incomingPayload);
} else
System.out.println("Received bad headers. Ignoring.");
// Hang up
os.flush();
// clientSocket.close();
}
}
}