Adding WebSocket Example using WebSocketServerProtocolHandler.
This commit is contained in:
parent
dbbc6ad73f
commit
b1cd953d02
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Copyright 2012 The Netty Project
|
||||
*
|
||||
* The Netty Project licenses this file to you under the Apache License,
|
||||
* version 2.0 (the "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
package io.netty.example.http.websocketx.html5;
|
||||
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.ChannelInboundMessageHandlerAdapter;
|
||||
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
|
||||
|
||||
public class CustomTextFrameHandler extends ChannelInboundMessageHandlerAdapter<TextWebSocketFrame> {
|
||||
|
||||
@Override
|
||||
public void messageReceived(ChannelHandlerContext ctx, TextWebSocketFrame frame) throws Exception {
|
||||
String request = frame.getText();
|
||||
ctx.channel().write(new TextWebSocketFrame(request.toUpperCase()));
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright 2012 The Netty Project
|
||||
*
|
||||
* The Netty Project licenses this file to you under the Apache License, version
|
||||
* 2.0 (the "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License at:
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
* License for the specific language governing permissions and limitations under
|
||||
* the License.
|
||||
*/
|
||||
package io.netty.example.http.websocketx.html5;
|
||||
|
||||
import io.netty.bootstrap.ServerBootstrap;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.channel.socket.SocketChannel;
|
||||
import io.netty.channel.socket.nio.NioEventLoopGroup;
|
||||
import io.netty.channel.socket.nio.NioServerSocketChannel;
|
||||
import io.netty.handler.codec.http.HttpChunkAggregator;
|
||||
import io.netty.handler.codec.http.HttpRequestDecoder;
|
||||
import io.netty.handler.codec.http.HttpResponseEncoder;
|
||||
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
/**
|
||||
* A WebSocket Server that respondes to requests at:
|
||||
*
|
||||
* <pre>
|
||||
* http://localhost:8080/websocket
|
||||
* </pre>
|
||||
*
|
||||
* The example differs from many of the other examples in Netty in that is does
|
||||
* not have an acomponying client. Instead a html page is provided that
|
||||
* interacts with this server. <br>
|
||||
* Open up the following file a web browser that supports WebSocket's:
|
||||
*
|
||||
* <pre>
|
||||
* example/src/main/resources/websocketx/html5/websocket.html
|
||||
* </pre>
|
||||
*
|
||||
* The html page is very simple were you simply enter some text and the server
|
||||
* will echo the same text back, but in uppercase. You, also see status messages
|
||||
* in the "Response From Server" area when client has connected, disconnected
|
||||
* etc.
|
||||
*
|
||||
*/
|
||||
public class WebSocketServer {
|
||||
|
||||
private final int port;
|
||||
|
||||
public WebSocketServer(int port) {
|
||||
this.port = port;
|
||||
}
|
||||
|
||||
public void run() throws Exception {
|
||||
final ServerBootstrap sb = new ServerBootstrap();
|
||||
try {
|
||||
sb.group(new NioEventLoopGroup(), new NioEventLoopGroup())
|
||||
.channel(NioServerSocketChannel.class)
|
||||
.localAddress(new InetSocketAddress(port))
|
||||
.childHandler(new ChannelInitializer<SocketChannel>() {
|
||||
@Override
|
||||
public void initChannel(final SocketChannel ch) throws Exception {
|
||||
ch.pipeline().addLast(
|
||||
new HttpRequestDecoder(),
|
||||
new HttpChunkAggregator(65536),
|
||||
new HttpResponseEncoder(),
|
||||
new WebSocketServerProtocolHandler("/websocket"),
|
||||
new CustomTextFrameHandler());
|
||||
}
|
||||
});
|
||||
|
||||
final Channel ch = sb.bind().sync().channel();
|
||||
System.out.println("Web socket server started at port " + port);
|
||||
|
||||
ch.closeFuture().sync();
|
||||
} finally {
|
||||
sb.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
int port;
|
||||
if (args.length > 0) {
|
||||
port = Integer.parseInt(args[0]);
|
||||
} else {
|
||||
port = 8080;
|
||||
}
|
||||
new WebSocketServer(port).run();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
textarea {
|
||||
width: 500px;
|
||||
height: 300px;
|
||||
}
|
50
example/src/main/resources/websocketx/html5/js/socket.js
Normal file
50
example/src/main/resources/websocketx/html5/js/socket.js
Normal file
@ -0,0 +1,50 @@
|
||||
(function() {
|
||||
var Sock = function() {
|
||||
var socket;
|
||||
if (!window.WebSocket) {
|
||||
window.WebSocket = window.MozWebSocket;
|
||||
}
|
||||
|
||||
if (window.WebSocket) {
|
||||
socket = new WebSocket("ws://localhost:8080/websocket");
|
||||
socket.onopen = onopen;
|
||||
socket.onmessage = onmessage;
|
||||
socket.onclose = onclose;
|
||||
} else {
|
||||
alert("Your browser does not support Web Socket.");
|
||||
}
|
||||
|
||||
function onopen(event) {
|
||||
getTextAreaElement().value = "Web Socket opened!";
|
||||
}
|
||||
|
||||
function onmessage(event) {
|
||||
appendTextArea(event.data);
|
||||
}
|
||||
function onclose(event) {
|
||||
appendTextArea("Web Socket closed");
|
||||
}
|
||||
|
||||
function appendTextArea(newData) {
|
||||
var el = getTextAreaElement();
|
||||
el.value = el.value + '\n' + newData;
|
||||
}
|
||||
|
||||
function getTextAreaElement() {
|
||||
return document.getElementById('responseText');
|
||||
}
|
||||
|
||||
function send(e) {
|
||||
e.preventDefault();
|
||||
if (window.WebSocket) {
|
||||
if (socket.readyState == WebSocket.OPEN) {
|
||||
socket.send(event.target.message.value);
|
||||
} else {
|
||||
alert("The socket is not open.");
|
||||
}
|
||||
}
|
||||
}
|
||||
document.forms.inputform.addEventListener('submit', send, false);
|
||||
}
|
||||
window.addEventListener('load', function() { new Sock(); }, false);
|
||||
})();
|
18
example/src/main/resources/websocketx/html5/websocket.html
Normal file
18
example/src/main/resources/websocketx/html5/websocket.html
Normal file
@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Web Socket Example</title>
|
||||
<link rel="stylesheet" href="css/socket.css">
|
||||
<script src="js/socket.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Enter a message</h1>
|
||||
<form name="inputform">
|
||||
<input type="text" name="message" id="message" placeholder="Enter text to be sent" autofocus>
|
||||
<input type="submit" value="Send Web Socket Data">
|
||||
</form>
|
||||
<h2>Repsonse from Server</h2>
|
||||
<textarea id="responseText"></textarea>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user