Adding WebSocket Example using WebSocketServerProtocolHandler.
This commit is contained in:
parent
d4155ad518
commit
ed65dffddf
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* 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 org.jboss.netty.example.http.websocketx.html5;
|
||||||
|
|
||||||
|
import org.jboss.netty.channel.ChannelHandlerContext;
|
||||||
|
import org.jboss.netty.channel.MessageEvent;
|
||||||
|
import org.jboss.netty.channel.SimpleChannelHandler;
|
||||||
|
import org.jboss.netty.handler.codec.http.websocketx.TextWebSocketFrame;
|
||||||
|
|
||||||
|
public class CustomTextFrameHandler extends SimpleChannelHandler {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
|
||||||
|
if (e.getMessage() instanceof TextWebSocketFrame) {
|
||||||
|
TextWebSocketFrame frame = (TextWebSocketFrame) e.getMessage();
|
||||||
|
ctx.getChannel().write(new TextWebSocketFrame(frame.getText().toUpperCase()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
* 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 org.jboss.netty.example.http.websocketx.html5;
|
||||||
|
|
||||||
|
import java.net.InetSocketAddress;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
|
import org.jboss.netty.bootstrap.ServerBootstrap;
|
||||||
|
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
|
||||||
|
import org.jboss.netty.example.http.websocketx.server.WebSocketServerPipelineFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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>
|
||||||
|
* netty/src/test/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() {
|
||||||
|
// Configure the server.
|
||||||
|
ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
|
||||||
|
Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
|
||||||
|
|
||||||
|
// Set up the event pipeline factory.
|
||||||
|
bootstrap.setPipelineFactory(new WebSocketServerPipelineFactory());
|
||||||
|
|
||||||
|
// Bind and start to accept incoming connections.
|
||||||
|
bootstrap.bind(new InetSocketAddress(port));
|
||||||
|
|
||||||
|
System.out.println("Web socket server started at port " + port + '.');
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int port;
|
||||||
|
if (args.length > 0) {
|
||||||
|
port = Integer.parseInt(args[0]);
|
||||||
|
} else {
|
||||||
|
port = 8080;
|
||||||
|
}
|
||||||
|
new WebSocketServer(port).run();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* 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 org.jboss.netty.example.http.websocketx.html5;
|
||||||
|
|
||||||
|
import static org.jboss.netty.channel.Channels.*;
|
||||||
|
|
||||||
|
import org.jboss.netty.channel.ChannelPipeline;
|
||||||
|
import org.jboss.netty.channel.ChannelPipelineFactory;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
|
||||||
|
import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
|
||||||
|
import org.jboss.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
|
||||||
|
|
||||||
|
public class WebSocketServerPipelineFactory implements ChannelPipelineFactory {
|
||||||
|
public ChannelPipeline getPipeline() throws Exception {
|
||||||
|
// Create a default pipeline implementation.
|
||||||
|
ChannelPipeline pipeline = pipeline();
|
||||||
|
pipeline.addLast("decoder", new HttpRequestDecoder());
|
||||||
|
pipeline.addLast("aggregator", new HttpChunkAggregator(65536));
|
||||||
|
pipeline.addLast("encoder", new HttpResponseEncoder());
|
||||||
|
pipeline.addLast("handler", new WebSocketServerProtocolHandler("/websocket"));
|
||||||
|
pipeline.addLast("testFramehandler", new CustomTextFrameHandler());
|
||||||
|
return pipeline;
|
||||||
|
}
|
||||||
|
}
|
4
src/test/resources/websocketx/html5/css/socket.css
Normal file
4
src/test/resources/websocketx/html5/css/socket.css
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
textarea {
|
||||||
|
width: 500px;
|
||||||
|
height: 300px;
|
||||||
|
}
|
53
src/test/resources/websocketx/html5/js/socket.js
Normal file
53
src/test/resources/websocketx/html5/js/socket.js
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
(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
src/test/resources/websocketx/html5/websocket.html
Normal file
18
src/test/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…
x
Reference in New Issue
Block a user