[Java] Netty Websocket Server Javascript Client(二)

2014-11-24 09:45:07 · 作者: · 浏览: 1
ctx, HttpRequest req)
throws Exception {
// 只接受 HTTP GET 请求
if (req.getMethod() != GET) {
sendHttpResponse(ctx, req, new DefaultHttpResponse(HTTP_1_1,
FORBIDDEN));
return;
}

// Websocket 握手开始
WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory(
getWebSocketLocation(req), null, false);
handshaker = wsFactory.newHandshaker(req);
if (handshaker == null) {
wsFactory.sendUnsupportedWebSocketVersionResponse(ctx.getChannel());
} else {
handshaker.handshake(ctx.getChannel(), req).addListener(
WebSocketServerHandshaker.HANDSHAKE_LISTENER);
}
}

private void handleWebSocketFrame(ChannelHandlerContext ctx,
WebSocketFrame frame) {
// Websocket 握手结束
if (frame instanceof CloseWebSocketFrame) {
handshaker.close(ctx.getChannel(), (CloseWebSocketFrame) frame);
return;
} else if (frame instanceof PingWebSocketFrame) {
ctx.getChannel().write(new PongWebSocketFrame(frame.getBinaryData()));
return;
} else if (!(frame instanceof TextWebSocketFrame)) {
throw new UnsupportedOperationException(String.format("%s frame types not supported",
frame.getClass().getName()));
}

// 处理接受到的数据(转成大写)并返回
String request = ((TextWebSocketFrame) frame).getText();
if (logger.isDebugEnabled()) {
logger.debug(String.format("Channel %s received %s", ctx.getChannel().getId(), request));
}
ctx.getChannel().write(new TextWebSocketFrame(request.toUpperCase()));
}

private static void sendHttpResponse(ChannelHandlerContext ctx,
HttpRequest req, HttpResponse res) {
// 返回 HTTP 错误页面
if (res.getStatus().getCode() != 200) {
res.setContent(ChannelBuffers.copiedBuffer(res.getStatus().toString(), CharsetUtil.UTF_8));
setContentLength(res, res.getContent().readableBytes());
}

// 发送返回信息并关闭连接
ChannelFuture f = ctx.getChannel().write(res);
if (!isKeepAlive(req) || res.getStatus().getCode() != 200) {
f.addListener(ChannelFutureListener.CLOSE);
}
}

private static String getWebSocketLocation(HttpRequest req) {
return "ws://" + req.getHeader(HttpHeaders.Names.HOST) + WEBSOCKET_PATH;
}
}

以上代码的逻辑还是比较清晰的:首先,在WebSocketServer中设置WebSocketServerPipelineFactory;然后,在WebSocketServerPipelineFactory中设置WebSocketServerHandler;接着,在WebSocketServerHandler处理请求并返回结果;其中,最重要的处理逻辑位于handleWebSocketFrame方法中,也就是把获取到的请求信息全部转化成大写并返回。最后,运行WebSocketServer.java就可以启动WebSocket服务,监听本地的8080端口。至此,WebSocket服务端已经全部准备就绪。这里,其实我们已经同时开发了一个简单的HTTP服务器,界面截图如下:

接下来,我们需要准备使用Javascript实现的WebSocket客户端,实现非常简单,java script代码实现如下:

websocket.html
[html]
Web Socket Client

<script type="text/java script">
var socket;
if (!window.WebSocket) {
window.WebSocket = window.MozWebSocket;
}
// java script Websocket Client
if (window.WebSocket) {
socket = new WebSocket("ws://localhost:8080/websocket");
socke