|
@@ -9,27 +9,37 @@ import io.undertow.websockets.core.WebSocketChannel;
|
9
|
9
|
import io.undertow.websockets.core.WebSockets;
|
10
|
10
|
import io.undertow.websockets.spi.WebSocketHttpExchange;
|
11
|
11
|
|
|
12
|
+import java.net.URL;
|
|
13
|
+import java.nio.file.Files;
|
|
14
|
+import java.nio.file.Paths;
|
|
15
|
+import java.util.Scanner;
|
|
16
|
+import java.util.stream.Stream;
|
|
17
|
+
|
12
|
18
|
import static io.undertow.Handlers.*;
|
13
|
19
|
|
14
|
20
|
public class CuisineHTTPServer extends Thread
|
15
|
21
|
{
|
16
|
22
|
final int webPagePort = 8080;
|
17
|
23
|
final int webSocketPort = 42069;
|
|
24
|
+ final int tcpSocketPort = 6868;
|
18
|
25
|
final String HOST = "localhost" ;
|
19
|
26
|
|
|
27
|
+ private static CuisineTCPServer fCuisineTCPServer;
|
20
|
28
|
|
21
|
29
|
public void startServer()
|
22
|
30
|
{
|
|
31
|
+ initResources();
|
|
32
|
+
|
23
|
33
|
//Create CuisineTCPServers
|
24
|
|
- CuisineTCPServer vTCPServer = new CuisineTCPServer();
|
25
|
|
- CuisineWebSocketMessageHandler vWebSocketMessageHandler = new CuisineWebSocketMessageHandler( vTCPServer );
|
|
34
|
+ fCuisineTCPServer = new CuisineTCPServer(tcpSocketPort);
|
|
35
|
+ CuisineWebSocketMessageHandler vWebSocketMessageHandler = new CuisineWebSocketMessageHandler( fCuisineTCPServer );
|
26
|
36
|
CuisineWebSocketConnectionHandler vWebSocketConnectionHandler = new CuisineWebSocketConnectionHandler( vWebSocketMessageHandler );
|
27
|
37
|
|
28
|
38
|
//Start HTTP Server : serve webpage with JS that calls the websocket
|
29
|
39
|
Undertow WebPageServer = Undertow.builder()
|
30
|
40
|
.addHttpListener(webPagePort, HOST)
|
31
|
41
|
.setHandler(
|
32
|
|
- new CuisineResponseHandler()
|
|
42
|
+ new CuisineResponseHandler("ws://"+HOST+":"+webSocketPort+"/data")
|
33
|
43
|
).build();
|
34
|
44
|
WebPageServer.start();
|
35
|
45
|
|
|
@@ -47,14 +57,38 @@ public class CuisineHTTPServer extends Thread
|
47
|
57
|
|
48
|
58
|
}
|
49
|
59
|
|
|
60
|
+ static String sHtml_ASCII_title;
|
|
61
|
+ static String sHtml_CSS;
|
|
62
|
+ static void initResources()
|
|
63
|
+ {
|
|
64
|
+ try {
|
|
65
|
+ sHtml_ASCII_title = new Scanner(CuisineHTTPServer.class.getResourceAsStream("html_ascii_title"), "UTF-8").useDelimiter("\\A").next();
|
|
66
|
+ sHtml_CSS = new Scanner(CuisineHTTPServer.class.getResourceAsStream("style.css"), "UTF-8").useDelimiter("\\A").next();
|
|
67
|
+ }
|
|
68
|
+ catch(Exception vex)
|
|
69
|
+ {
|
|
70
|
+ vex.printStackTrace();
|
|
71
|
+ sHtml_ASCII_title = "Galère les resources";
|
|
72
|
+ }
|
|
73
|
+ }
|
|
74
|
+
|
50
|
75
|
private class CuisineResponseHandler implements HttpHandler
|
51
|
76
|
{
|
|
77
|
+ private String fWebSocketConnectionUri;
|
52
|
78
|
|
|
79
|
+ public CuisineResponseHandler(String iWebSocketConnectionUri)
|
|
80
|
+ {
|
|
81
|
+ super();
|
|
82
|
+
|
|
83
|
+ fWebSocketConnectionUri = iWebSocketConnectionUri;
|
|
84
|
+ }
|
53
|
85
|
@Override
|
54
|
86
|
public void handleRequest(HttpServerExchange exchange) throws Exception {
|
55
|
87
|
//Serve webpage
|
56
|
|
- exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
|
57
|
|
- exchange.getResponseSender().send("Salut, gropd!");
|
|
88
|
+ exchange.getResponseHeaders()
|
|
89
|
+ .put(Headers.CONTENT_TYPE, "text/html")
|
|
90
|
+ .put(Headers.CONTENT_ENCODING,"utf-8");
|
|
91
|
+ exchange.getResponseSender().send(getHTMLFrontPage(fWebSocketConnectionUri));
|
58
|
92
|
}
|
59
|
93
|
}
|
60
|
94
|
|
|
@@ -80,6 +114,7 @@ public class CuisineHTTPServer extends Thread
|
80
|
114
|
|
81
|
115
|
protected CuisineWebSocketMessageHandler( CuisineTCPServer iTCPServer)
|
82
|
116
|
{
|
|
117
|
+
|
83
|
118
|
fTCPServer = iTCPServer;
|
84
|
119
|
}
|
85
|
120
|
|
|
@@ -88,6 +123,41 @@ public class CuisineHTTPServer extends Thread
|
88
|
123
|
//Handle message on webSocket
|
89
|
124
|
WebSockets.sendText(String.valueOf(fTCPServer.getCurrentTemperature()), iChannel, null);
|
90
|
125
|
}
|
|
126
|
+ }
|
|
127
|
+
|
91
|
128
|
|
|
129
|
+ static String getHTMLFrontPage(String iWsUri)
|
|
130
|
+ {
|
|
131
|
+ StringBuilder vBuilder = new StringBuilder();
|
|
132
|
+ vBuilder
|
|
133
|
+ .append("<head>")
|
|
134
|
+ .append("<meta charset=\"UTF-8\">")
|
|
135
|
+ .append("<style>")
|
|
136
|
+ .append(sHtml_CSS)
|
|
137
|
+ .append("</style>")
|
|
138
|
+ .append("</head>")
|
|
139
|
+ .append("<div class=\"pre\">")
|
|
140
|
+ .append(sHtml_ASCII_title)
|
|
141
|
+ .append("</div>")
|
|
142
|
+ .append("<h1 id=\"tempValue\">None</h1>")
|
|
143
|
+ .append("<script>")
|
|
144
|
+ .append("var socket=new WebSocket(\""+iWsUri+"\");\n")
|
|
145
|
+ .append("let connected=false;")
|
|
146
|
+ .append("let view=document.getElementById(\"tempValue\");")
|
|
147
|
+ .append("socket.onerror=function(error){connected=false;view.innerHTML=\"oups :(\";};")
|
|
148
|
+ .append("socket.onmessage=function(event){view.innerHTML=event.data+\"°C\"};")
|
|
149
|
+ .append("socket.onopen=function(e){")
|
|
150
|
+ .append("connected=true;")
|
|
151
|
+ .append("callServer();")
|
|
152
|
+ .append("};")
|
|
153
|
+ .append("var callServer=function(){")
|
|
154
|
+ .append("socket.send(\"coucou\");")
|
|
155
|
+ .append("};")
|
|
156
|
+ .append("let timer=setInterval(callServer,100);")
|
|
157
|
+ .append("</script>")
|
|
158
|
+ .append("")
|
|
159
|
+
|
|
160
|
+ ;
|
|
161
|
+ return vBuilder.toString();
|
92
|
162
|
}
|
93
|
163
|
}
|