当前位置:   article > 正文

netty与websocket如何实现参数传递_netty websocket 连接传递参数

netty websocket 连接传递参数

Websocket:

Websocket是HTML5新增加的协议,在服务器与浏览器之间建立一个不受限的双向通道,可以实现服务器主动向浏览器推送消息。

Websocket是利用Http协议来实现的。webscoket连接是都是通过浏览器发起的。他的建立连接请求是一个http请求。

请求格式如下:

  1. GET ws://localhost:3000/ws/chat HTTP/1.1
  2. Host: localhost
  3. Upgrade: websocket //表明这个连接将要被转为websocket连接
  4. Connection: Upgrade
  5. Origin: http://localhost:3000
  6. Sec-WebSocket-Key: client-random-string //用来标识连接
  7. Sec-WebSocket-Version: 13

服务器响应:

  1. HTTP/1.1 101 Switching Protocols
  2. Upgrade: websocket
  3. Connection: Upgrade
  4. Sec-WebSocket-Accept: server-random-string

响应码101代表协议即将转化。那么我们传递参数也就是通过这一次http建立连接。

我们在建立连接时候将请求截下来,然后拿掉参数,再把它的拿出来,从新封装url。

我们在pipeline添加如下handler

  1. ch.pipeline().addLast("http-decoder", new HttpServerCodec());
  2. // 加入ObjectAggregator解码器,作用是他会把多个消息转换为单一的FullHttpRequest或者FullHttpResponse
  3. ch.pipeline().addLast("http-aggregator", new HttpObjectAggregator(65536));
  4. // 加入chunked 主要作用是支持异步发送的码流(大文件传输),但不专用过多的内存,防止java内存溢出
  5. ch.pipeline().addLast(new ChunkedWriteHandler());
  6. // 加入自定义handler
  7. ch.pipeline().addLast( handler);
  8. // 加入webSocket的hanlder
  9. ch.pipeline().addLast(new WebSocketServerProtocolHandler("/ws"));

顺序不能错,亲身实践,代码玄学(其实是自己学的不到位)

然后在自己的handler里边重写read方法(注意是read不是read0)

  1. @Override
  2. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  3. if (null != msg && msg instanceof FullHttpRequest) {
  4. logger.info("准备提取token");
  5. //转化为http请求
  6. FullHttpRequest request = (FullHttpRequest) msg;
  7. //拿到请求地址
  8. String uri = request.uri();
  9. //判断是不是websocket请求,如果是拿出我们传递的参数(我的是token)
  10. String origin = request.headers().get("Origin");
  11. if (null == origin) {
  12. ctx.close();
  13. } else {
  14. if (null != uri && uri.contains("/ws") && uri.contains("?")) {
  15. String[] uriArray = uri.split("\\?");
  16. if (null != uriArray && uriArray.length > 1) {
  17. String[] paramsArray = uriArray[1].split("=");
  18. if (null != paramsArray && paramsArray.length > 1) {
  19. srctoken = paramsArray[1];
  20. logger.info("提取token成功");
  21. }
  22. }
  23. //重新设置请求地址
  24. request.setUri("/ws");
  25. }
  26. }
  27. }
  28. //接着建立请求
  29. super.channelRead(ctx, msg);
  30. }

其实这个步骤是,在建立连接的时候在中途给他截下来参数,然后把参数去掉接着执行。

前台代码:

  1. window.CHAT = {
  2. socket: null,
  3. init: function() {
  4. if (window.WebSocket) {
  5. CHAT.socket = new WebSocket("ws://127.0.0.1:8888/ws?token=测试");
  6. CHAT.socket.onopen = function(event) {
  7. console.log("连接建立成功...");
  8. };
  9. CHAT.socket.onclose = function(event) {
  10. console.log("连接关闭...");
  11. };
  12. CHAT.socket.onerror = function(event) {
  13. console.log("发生错误...");
  14. console.log(event);
  15. };
  16. CHAT.socket.onmessage = function(e) {
  17. console.log("接收到消息" + e.data);
  18. var receiveMsg = document.getElementById("receiveMsg");
  19. var html = receiveMsg.innerHTML;
  20. receiveMsg.innerHTML = html + "\n" + e.data;
  21. };
  22. } else {
  23. alert("浏览器不支持websocket协议...");
  24. }
  25. },
  26. chat: function() {
  27. var msg = document.getElementById("msgContent");
  28. CHAT.socket.send(msg.value);
  29. }
  30. };
  31. CHAT.init();

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/877986
推荐阅读
相关标签
  

闽ICP备14008679号