-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathWsHandler.java
More file actions
83 lines (72 loc) · 3.07 KB
/
Copy pathWsHandler.java
File metadata and controls
83 lines (72 loc) · 3.07 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
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketFrame;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.eclipse.jetty.websocket.api.extensions.Frame;
import org.eclipse.jetty.websocket.server.WebSocketHandler;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.Socket;
import java.nio.ByteBuffer;
// http://jansipke.nl/websocket-tutorial-with-java-server-jetty-and-javascript-client/
@WebSocket
public class WsHandler extends WebSocketHandler {
Socket vncSocket;
int vncPort = 5900;
String vncPassword = "password";
@Override
public void configure(WebSocketServletFactory webSocketServletFactory) {
webSocketServletFactory.register(WsHandler.class);
}
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
if(this.getWebSocketFactory().isUpgradeRequest(request, response)) {
response.addHeader("Sec-WebSocket-Protocol", "binary");
if(this.getWebSocketFactory().acceptWebSocket(request, response)) {
baseRequest.setHandled(true);
return;
}
if(response.isCommitted()) {
return;
}
}
super.handle(target, baseRequest, request, response);
}
@OnWebSocketConnect
public void onConnect(final Session session) throws IOException, InterruptedException {
System.out.println("Connect: " + session.getRemoteAddress().getAddress());
System.out.println(session.getUpgradeRequest().getRequestURI());
vncSocket = new Socket("127.0.0.1", vncPort);
Thread readThread = new Thread(new Runnable() {
public void run() {
try {
byte[] b = new byte[1500];
int readBytes;
while (true){
readBytes = vncSocket.getInputStream().read(b);
System.out.printf("read bytes %d\n", readBytes);
if (readBytes == -1){
break;
}
if (readBytes > 0) {
session.getRemote().sendBytes(ByteBuffer.wrap(b,0, readBytes));
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
readThread.start();
}
@OnWebSocketFrame
public void onFrame(Frame f) throws IOException {
System.out.printf("Frame: %d\n", f.getPayloadLength());
byte[] data = new byte[f.getPayloadLength()];
f.getPayload().get(data);
vncSocket.getOutputStream().write(data);
}
}