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…
Reference in New Issue
Block a user