Skip to content

Commit 74ecb3f

Browse files
committed
added wss support
added simple http server
1 parent 0239484 commit 74ecb3f

File tree

9 files changed

+440
-14
lines changed

9 files changed

+440
-14
lines changed

examples/src/main/java/com/amo/websocket/examples/EchoServer.java renamed to examples/src/main/java/com/amo/websocket/examples/EchoEndpoint.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,10 @@
22

33
import com.amo.websocket.api.Endpoint;
44
import com.amo.websocket.api.Session;
5-
import com.amo.websocket.server.BasicContainer;
65

76
import javax.websocket.CloseReason;
8-
import java.io.IOException;
9-
import java.net.URISyntaxException;
107

11-
public class EchoServer implements Endpoint {
8+
public class EchoEndpoint implements Endpoint {
129

1310
private Session session;
1411

@@ -39,12 +36,4 @@ public void onError(Throwable throwable) {
3936
public void onClose(CloseReason closeReason) {
4037
System.out.println("Received close: " + closeReason.getCloseCode());
4138
}
42-
43-
44-
public static void main(String[] args) throws URISyntaxException, InterruptedException, IOException {
45-
BasicContainer bc = new BasicContainer();
46-
bc.registerEndpoint("/", new EchoServer());
47-
bc.listen(8080);
48-
System.in.read();
49-
}
5039
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.amo.websocket.examples;
2+
3+
import com.amo.websocket.server.BasicContainer;
4+
5+
import java.io.IOException;
6+
import java.net.URISyntaxException;
7+
8+
/**
9+
* Created by ayeminoo on 1/25/18.
10+
*/
11+
public class NormalEchoServer {
12+
public static void main(String[] args) throws URISyntaxException, InterruptedException, IOException {
13+
BasicContainer bc = new BasicContainer();
14+
bc.registerEndpoint("/", new EchoEndpoint());
15+
bc.listen(8080);
16+
System.in.read();
17+
}
18+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.amo.websocket.examples;
2+
3+
import com.amo.websocket.server.BasicContainer;
4+
5+
import java.io.IOException;
6+
import java.net.URISyntaxException;
7+
import java.security.KeyManagementException;
8+
import java.security.KeyStoreException;
9+
import java.security.NoSuchAlgorithmException;
10+
import java.security.UnrecoverableKeyException;
11+
import java.security.cert.CertificateException;
12+
13+
/**
14+
* Created by ayeminoo on 1/25/18.
15+
*/
16+
public class SecureEchoServer {
17+
public static void main(String[] args) throws URISyntaxException, InterruptedException, IOException, UnrecoverableKeyException, CertificateException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
18+
String filePath = "keystore.jks";
19+
String keyPass = "password";
20+
String storePass = "password";
21+
String alias = "selfsigned";
22+
23+
BasicContainer bc = new BasicContainer();
24+
bc.registerEndpoint("/", new EchoEndpoint());
25+
26+
//load the key file
27+
//since our current self-signed keyfile is in resource folder, we can load it using classloader
28+
bc.setTLSKeyStore(ClassLoader.getSystemResourceAsStream(filePath), keyPass, storePass, alias);
29+
30+
// we can also load by giving full path
31+
// bc.setTLSKeyStore("/home/ayeminoo/data/projects-in-progress/simple-java-websocket/examples/src/main/resources/keystore.jks", keyPass, storePass, alias);
32+
33+
bc.listen(8080);
34+
System.in.read();
35+
36+
}
37+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package com.amo.websocket.examples.http;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.io.OutputStream;
7+
import java.io.UnsupportedEncodingException;
8+
import java.net.URI;
9+
import java.net.URLDecoder;
10+
import java.util.ArrayList;
11+
import java.util.HashMap;
12+
import java.util.List;
13+
import java.util.Map;
14+
import java.util.Set;
15+
16+
import com.sun.net.httpserver.Headers;
17+
import com.sun.net.httpserver.HttpExchange;
18+
import com.sun.net.httpserver.HttpHandler;
19+
20+
public class Handlers {
21+
public static class RootHandler implements HttpHandler {
22+
23+
@Override
24+
public void handle(HttpExchange he) throws IOException {
25+
String response = "<h1>Server start success if you see this message</h1>" + "<h1>Port: " + 9999 + "</h1>";
26+
he.sendResponseHeaders(200, response.length());
27+
OutputStream os = he.getResponseBody();
28+
os.write(response.getBytes());
29+
os.close();
30+
}
31+
}
32+
33+
public static class EchoHeaderHandler implements HttpHandler {
34+
35+
@Override
36+
public void handle(HttpExchange he) throws IOException {
37+
Headers headers = he.getRequestHeaders();
38+
Set<Map.Entry<String, List<String>>> entries = headers.entrySet();
39+
String response = "";
40+
for (Map.Entry<String, List<String>> entry : entries)
41+
response += entry.toString() + "\n";
42+
he.sendResponseHeaders(200, response.length());
43+
OutputStream os = he.getResponseBody();
44+
os.write(response.toString().getBytes());
45+
os.close();
46+
}
47+
}
48+
49+
public static class EchoGetHandler implements HttpHandler {
50+
51+
@Override
52+
public void handle(HttpExchange he) throws IOException {
53+
// parse request
54+
Map<String, Object> parameters = new HashMap<String, Object>();
55+
URI requestedUri = he.getRequestURI();
56+
String query = requestedUri.getRawQuery();
57+
parseQuery(query, parameters);
58+
// send response
59+
String response = "";
60+
for (String key : parameters.keySet())
61+
response += key + " = " + parameters.get(key) + "\n";
62+
he.sendResponseHeaders(200, response.length());
63+
OutputStream os = he.getResponseBody();
64+
os.write(response.toString().getBytes());
65+
os.close();
66+
}
67+
68+
}
69+
70+
public static class EchoPostHandler implements HttpHandler {
71+
72+
@Override
73+
public void handle(HttpExchange he) throws IOException {
74+
System.out.println("Served by /echoPost handler...");
75+
// parse request
76+
Map<String, Object> parameters = new HashMap<String, Object>();
77+
InputStreamReader isr = new InputStreamReader(he.getRequestBody(), "utf-8");
78+
BufferedReader br = new BufferedReader(isr);
79+
String query = br.readLine();
80+
parseQuery(query, parameters);
81+
// send response
82+
String response = "";
83+
for (String key : parameters.keySet())
84+
response += key + " = " + parameters.get(key) + "\n";
85+
he.sendResponseHeaders(200, response.length());
86+
OutputStream os = he.getResponseBody();
87+
os.write(response.toString().getBytes());
88+
os.close();
89+
90+
}
91+
}
92+
93+
@SuppressWarnings("unchecked")
94+
public static void parseQuery(String query, Map<String, Object> parameters) throws UnsupportedEncodingException {
95+
96+
if (query != null) {
97+
String pairs[] = query.split("[&]");
98+
99+
for (String pair : pairs) {
100+
String param[] = pair.split("[=]");
101+
102+
String key = null;
103+
String value = null;
104+
if (param.length > 0) {
105+
key = URLDecoder.decode(param[0], System.getProperty("file.encoding"));
106+
}
107+
108+
if (param.length > 1) {
109+
value = URLDecoder.decode(param[1], System.getProperty("file.encoding"));
110+
}
111+
112+
if (parameters.containsKey(key)) {
113+
Object obj = parameters.get(key);
114+
if (obj instanceof List<?>) {
115+
List<String> values = (List<String>) obj;
116+
values.add(value);
117+
} else if (obj instanceof String) {
118+
List<String> values = new ArrayList<String>();
119+
values.add((String) obj);
120+
values.add(value);
121+
parameters.put(key, values);
122+
}
123+
} else {
124+
parameters.put(key, value);
125+
}
126+
}
127+
}
128+
}
129+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.amo.websocket.examples.http;
2+
3+
import com.sun.net.httpserver.HttpsConfigurator;
4+
import com.sun.net.httpserver.HttpsParameters;
5+
import com.sun.net.httpserver.HttpsServer;
6+
7+
import javax.net.ssl.KeyManagerFactory;
8+
import javax.net.ssl.SSLContext;
9+
import javax.net.ssl.SSLEngine;
10+
import javax.net.ssl.SSLParameters;
11+
import javax.net.ssl.TrustManagerFactory;
12+
import java.io.FileInputStream;
13+
import java.io.IOException;
14+
import java.net.InetSocketAddress;
15+
import java.security.KeyManagementException;
16+
import java.security.KeyStore;
17+
import java.security.KeyStoreException;
18+
import java.security.NoSuchAlgorithmException;
19+
import java.security.UnrecoverableKeyException;
20+
import java.security.cert.CertificateException;
21+
22+
public class SimpleHttpsServer {
23+
private int port;
24+
private HttpsServer server;
25+
private static String protocol = "TLS";
26+
27+
public void Start(int port) {
28+
try {
29+
this.port = port;
30+
// load certificate
31+
String keystoreFilename = "/home/ayeminoo/data/projects-in-progress/simple-java-websocket/examples/src/main/resources/keystore.jks";
32+
char[] storepass = "password".toCharArray();
33+
char[] keypass = "password".toCharArray();
34+
String alias = "selfsigned";
35+
FileInputStream fIn = new FileInputStream(keystoreFilename);
36+
KeyStore keystore = KeyStore.getInstance("JKS");
37+
keystore.load(fIn, storepass);
38+
// display certificate
39+
// Certificate cert = keystore.getCertificate(alias);
40+
// System.out.println(cert);
41+
42+
// setup the key manager factory
43+
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
44+
kmf.init(keystore, keypass);
45+
46+
// setup the trust manager factory
47+
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
48+
tmf.init(keystore);
49+
50+
// create https server
51+
server = HttpsServer.create(new InetSocketAddress(port), 0);
52+
// create ssl context
53+
SSLContext sslContext = SSLContext.getInstance(protocol);
54+
// setup the HTTPS context and parameters
55+
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
56+
server.setHttpsConfigurator(new HttpsConfigurator(sslContext) {
57+
public void configure(HttpsParameters params) {
58+
try {
59+
// initialise the SSL context
60+
SSLContext c = SSLContext.getDefault();
61+
SSLEngine engine = c.createSSLEngine();
62+
params.setNeedClientAuth(false);
63+
params.setCipherSuites(engine.getEnabledCipherSuites());
64+
params.setProtocols(engine.getEnabledProtocols());
65+
66+
// get the default parameters
67+
SSLParameters defaultSSLParameters = c.getDefaultSSLParameters();
68+
params.setSSLParameters(defaultSSLParameters);
69+
} catch (Exception ex) {
70+
ex.printStackTrace();
71+
System.out.println("Failed to create HTTPS server");
72+
}
73+
}
74+
});
75+
76+
System.out.println("server started at " + port);
77+
server.createContext("/", new Handlers.RootHandler());
78+
server.createContext("/echoHeader", new Handlers.EchoHeaderHandler());
79+
server.createContext("/echoGet", new Handlers.EchoGetHandler());
80+
server.createContext("/echoPost", new Handlers.EchoPostHandler());
81+
server.setExecutor(null);
82+
server.start();
83+
} catch (IOException e) {
84+
e.printStackTrace();
85+
} catch (NoSuchAlgorithmException e) {
86+
// TODO Auto-generated catch block
87+
e.printStackTrace();
88+
} catch (KeyStoreException e) {
89+
// TODO Auto-generated catch block
90+
e.printStackTrace();
91+
} catch (CertificateException e) {
92+
// TODO Auto-generated catch block
93+
e.printStackTrace();
94+
} catch (KeyManagementException e) {
95+
// TODO Auto-generated catch block
96+
e.printStackTrace();
97+
} catch (UnrecoverableKeyException e) {
98+
// TODO Auto-generated catch block
99+
e.printStackTrace();
100+
}
101+
}
102+
103+
private String getPath() {
104+
return this.getClass().getClassLoader().getResource("").getPath() + "com/happylife/demo/";
105+
}
106+
107+
public void Stop() {
108+
server.stop(0);
109+
System.out.println("server stopped");
110+
}
111+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.amo.websocket.examples.http;
2+
3+
/**
4+
* Created by ayeminoo on 1/20/18.
5+
*/
6+
public class Test {
7+
8+
public static void main(String[] args) {
9+
// // start http server
10+
// SimpleHttpServer httpServer = new SimpleHttpServer();
11+
// httpServer.Start(port);
12+
13+
// start https server
14+
SimpleHttpsServer httpsServer = new SimpleHttpsServer();
15+
httpsServer.Start(9999);
16+
17+
// System.out.println(System.getProperty("user.dir"));
18+
// System.out.println(Main.class.getClassLoader().getResource("").getPath());
19+
20+
}
21+
22+
// public static void main(String [] args) throws IOException, KeyStoreException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {
23+
// // load certificate
24+
// String keystoreFilename = "/home/ayeminoo/data/Testing Projects/ssldemo/mykey.keystore";
25+
// char[] storepass = "mypassword".toCharArray();
26+
// char[] keypass = "mypassword".toCharArray();
27+
// String alias = "alias";
28+
// FileInputStream fIn = new FileInputStream(keystoreFilename);
29+
// KeyStore keystore = KeyStore.getInstance("JKS");
30+
// keystore.load(fIn, storepass);
31+
//// display certificate
32+
// Certificate cert = keystore.getCertificate(alias);
33+
// System.out.println(cert);
34+
//// setup the key manager factory
35+
// KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
36+
// kmf.init(keystore, keypass);
37+
//// setup the trust manager factory
38+
// TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
39+
// tmf.init(keystore);
40+
//
41+
//
42+
// // create https server
43+
// HttpsServer server = HttpsServer.create(new InetSocketAddress(8889), 0);
44+
//// create ssl context
45+
// SSLContext sslContext = SSLContext.getInstance("TLS");
46+
//// setup the HTTPS context and parameters
47+
// sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
48+
// server.setHttpsConfigurator(new HttpsConfigurator(sslContext) {
49+
// public void configure(HttpsParameters params) {
50+
// try {
51+
// // initialise the SSL context
52+
// SSLContext c = SSLContext.getDefault();
53+
// SSLEngine engine = c.createSSLEngine();
54+
// params.setNeedClientAuth(false);
55+
// params.setCipherSuites(engine.getEnabledCipherSuites());
56+
// params.setProtocols(engine.getEnabledProtocols());
57+
// // get the default parameters
58+
// SSLParameters defaultSSLParameters = c.getDefaultSSLParameters();
59+
// params.setSSLParameters(defaultSSLParameters);
60+
// } catch (Exception ex) {
61+
// ex.printStackTrace();
62+
// System.out.println("Failed to create HTTPS server");
63+
// }
64+
// }
65+
// });
66+
// server.start();
67+
// }
68+
}
2.16 KB
Binary file not shown.

0 commit comments

Comments
 (0)