forked from netty/netty
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding WebSocket Example using WebSocketServerProtocolHandler.
- Loading branch information
Showing
5 changed files
with
200 additions
and
0 deletions.
There are no files selected for viewing
30 changes: 30 additions & 0 deletions
30
example/src/main/java/io/netty/example/http/websocketx/html5/CustomTextFrameHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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())); | ||
} | ||
|
||
} |
98 changes: 98 additions & 0 deletions
98
example/src/main/java/io/netty/example/http/websocketx/html5/WebSocketServer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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(); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
textarea { | ||
width: 500px; | ||
height: 300px; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 changes: 18 additions & 0 deletions
18
example/src/main/resources/websocketx/html5/websocket.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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> |