netty与websocket如何实现参数传递
Websocket:
Websocket是HTML5新增加的协议,在服务器与浏览器之间建⽴⼀个不受限的双向通道,可以实现服务器主动向浏览器推送消息。Websocket是利⽤Http协议来实现的。webscoket连接是都是通过浏览器发起的。他的建⽴连接请求是⼀个http请求。
请求格式如下:
GET ws://localhost:3000/ws/chat HTTP/1.1
Host: localhost
Upgrade: websocket                          //表明这个连接将要被转为websocket连接
Connection: Upgrade
Origin: localhost:3000
Sec-WebSocket-Key: client-random-string      //⽤来标识连接
Sec-WebSocket-Version: 13
服务器响应:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: server-random-string
响应码101代表协议即将转化。那么我们传递参数也就是通过这⼀次http建⽴连接。
我们在建⽴连接时候将请求截下来,然后拿掉参数,再把它的拿出来,从新封装url。
我们在pipeline添加如下handler
ch.pipeline().addLast("http-decoder", new HttpServerCodec());
// 加⼊ObjectAggregator解码器,作⽤是他会把多个消息转换为单⼀的FullHttpRequest或者FullHttpResponse
ch.pipeline().addLast("http-aggregator", new HttpObjectAggregator(65536));
// 加⼊chunked 主要作⽤是⽀持异步发送的码流(⼤⽂件传输),但不专⽤过多的内存,防⽌java内存溢出
ch.pipeline().addLast(new ChunkedWriteHandler());
// 加⼊⾃定义handler
ch.pipeline().addLast( handler);
// 加⼊webSocket的hanlder
ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws"));
顺序不能错,亲⾝实践,代码⽞学(其实是⾃⼰学的不到位)
然后在⾃⼰的handler⾥边重写read⽅法(注意是read不是read0)
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
if (null != msg && msg instanceof FullHttpRequest) {
logger.info("准备提取token");
//转化为http请求
FullHttpRequest request = (FullHttpRequest) msg;
//拿到请求地址
String uri = request.uri();
//判断是不是websocket请求,如果是拿出我们传递的参数(我的是token)
String origin = request.headers().get("Origin");
if (null == origin) {
ctx.close();
} else {
if (null != uri && ains("/ws") && ains("?")) {
String[] uriArray = uri.split("\\?");
if (null != uriArray && uriArray.length > 1) {
String[] paramsArray = uriArray[1].split("=");
if (null != paramsArray && paramsArray.length > 1) {
srctoken = paramsArray[1];
websocket和socket
logger.info("提取token成功");
}
}
//重新设置请求地址
request.setUri("/ws");
}
}
}
//接着建⽴请求
super.channelRead(ctx, msg);
}
其实这个步骤是,在建⽴连接的时候在中途给他截下来参数,然后把参数去掉接着执⾏。前台代码:
window.CHAT = {
socket: null,
init: function() {
if (window.WebSocket) {
CHAT.socket = new WebSocket("ws://127.0.0.1:8888/ws?token=测试");                    pen = function(event) {
console.log("连接建⽴成功...");
};
lose = function(event) {
console.log("连接关闭...");
};
r = function(event) {
console.log("发⽣错误...");
console.log(event);
};
ssage = function(e) {
console.log("接收到消息" + e.data);
var receiveMsg = ElementById("receiveMsg");
var html = receiveMsg.innerHTML;
receiveMsg.innerHTML = html + "\n" + e.data;
};
} else {
alert("浏览器不⽀持websocket协议...");
}
},
chat: function() {
var msg = ElementById("msgContent");
CHAT.socket.send(msg.value);
}
};
CHAT.init();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。