精华内容
下载资源
问答
  • 主要给大家介绍了关于WebSocket部署服务器出现连接失败问题的分析与解决方法,文中给出了详细的介绍供大家参考学习,文末也给出了demo下载地址,需要的朋友们可以下载学习,下面随着小编来一起学习学习吧。
  • 最近项目中有端对端通信场景,实时性要求较高,考虑后选用了websocket 这一通信协议,本地做了个demo测试,跑的好好的,部署到测试服务器上,出现了客户端连接服务端时提示404的问题,下面来看下。 正文 问题描述 ...

    前言

         最近项目中有端对端通信场景,实时性要求较高,考虑后选用了websocket 这一通信协议,本地做了个demo测试,跑的好好的,部署到测试服务器上,出现了客户端连接服务端时提示404的问题,下面来看下。

    正文

    问题描述

    本地客户端程序简单写了个html,连接到服务端成功后的页面如下
    在这里插入图片描述
    将服务端代码部署到测试服务器上,想跟另一端做联调测试,部署完后,本地客户端再次连接,显示异常:
    在这里插入图片描述
    看浏览器控制台报错如下:

    在这里插入图片描述

    WebSocket connection to 'ws://ip:port/temperature/productWebSocket/9006' failed: Error during WebSocket handshake: Unexpected response code: 404
    

    解决方法

        修改服务器上nginx.conf 如下:

    location /temperature{
    proxy_pass http://127.0.0.1:port/temperature;
    # 增加Upgrade协议头和Connection协议头,使http连接升级到websocket连接
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    }
    

    原因分析

         我们都知道http协议使无状态的,而websocket协议是建立一个tcp 长链接,而websocket协议的握手和http 是兼容的,它使用http 的Upgrade协议头将Http 连接升级到WebSocket连接,这个特性使得websocket应用程序可以很容易地应用到现有的基础设施。
    大家可以看下http 和 websocket 通信协议在浏览器上的不同:
    Http协议:
    在这里插入图片描述
    WebSocket协议:
    在这里插入图片描述

         WebSocket协议的握手和HTTP是兼容的,它使用HTTP的Upgrade协议头将连接从HTTP连接升级到WebSocket连接。这个特性使得WebSocket应用程序可以很容易地应用到现有的基础设施。
         HTTP的Upgrade协议头机制用于将连接从HTTP连接升级为WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头。反向代理服务器在支持WebSocket协议方面面临着一些挑战。挑战之一是WebSocket是一个逐段转发(hop-by-hop)协议,因此当代理服务器拦截到来自客户端的Upgrade请求时,代理服务器需要将自己的Upgrade请求发送给后端服务器,包括合适的请求头。而且,由于WebSocket连接是长连接,与传统的HTTP端连接截然不同,故反向代理服务器还需要允许将这些连接处于打开状态,而不能因为其空闲就关闭了连接。

    参考链接

    https://www.jb51.net/article/59847.htm

    总结

         终于又把websocket 拾了起来,感谢您的阅读,希望对您有帮助~

    展开全文
  • 本地搭建正常运行,可以连接websocket,但是部署服务器后,会报错,无法连接。 Error during WebSocket handshake: Unexpected response code: 400 还是502错误来着。经过测试,发现在连接上出错 wss:连接 报错。...

    记录最近两天在本地搭建简单的springboot + websocket遇到的问题。

    本地搭建正常运行,可以连接websocket,但是部署服务器后,会报错,无法连接。

    Error during WebSocket handshake: Unexpected response code: 400  还是502错误来着。经过测试,发现在连接上出错

    wss:连接  报错。最后在nginx配置上发现错误。正确配置如下:

    #websocket
    	location /websocket {
        		proxy_pass http://127.0.0.1:2001;
        		proxy_http_version 1.1;    #websoket必须要使用的协议,http 1.1
        		proxy_set_header Upgrade $http_upgrade;  #要使用websocket协议时,响应http升级请求
        		proxy_set_header Connection "upgrade";
    	}
    

    这时候可以正常联通websocket。

    另外,如果使用的是独立的Tomcat,那么要将如下Bean注释掉,该bean会使用springboot内部的tomcat

    @Configuration
    public class WebSocketConfig {
        /**
         * 注入ServerEndpointExporter,
         * 这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint
         * @return
         */
        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }
    

    出错问题,可以从下面几点排查:

    1、防火墙是否有禁用相应端口。

    2、在配置好springboot+websocket后,不着急写网页去wss连接,可以百度搜索websocket在线测试工具,测试是否项目搭建成功,这样可以在最开始配置阶段知道是否成功,排查起来省力。

    3、重点查看nginx的配置是否正确。在配置完成后记得要重启Nginx。

    如果还存在问题,可以评论一起沟通学习。

    展开全文
  • WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safari,Firefox,Opera,IE等等,下面这篇文章主要给大家介绍了关于WebSocket部署服务器但外网无法连接的解决方法,需要的朋友可以...
  • 修改了 一个BUG 直接覆盖吧 博文链接:https://lchshu001.iteye.com/blog/1184428
  • 部署到Now的流行WebSocket服务器示例,带有基准测试
  • websocket是什么呢,websocket是一个和服务器通信的新的协议,一般而言,浏览器和服务器通信最常用的是http协议,但是http协议是无状态的,每次浏览器请求信息,服务器返回信息后这个浏览器和服务器通信的信道就被...

    b6247b6f7185eca25edf8c5257452f3d.png

    websocket是什么呢,websocket是一个和服务器通信的新的协议,一般而言,浏览器和服务器通信最常用的是http协议,但是http协议是无状态的,每次浏览器请求信息,服务器返回信息后这个浏览器和服务器通信的信道就被关闭了,这样使得服务器如果想主动给浏览器发送信息变得不可能了,服务器推技术在http时代的解决方案一个是客户端去轮询,或是使用comet技术,而websocket则和一般的socket一样,使得浏览器和服务器建立了一个双工的通道。

    具体的websocket协议在rfc6455里面有,这里简要说明一下。websocket通信需要先有个握手的过程,使得协议由http转变为webscoket协议,然后浏览器和服务器就可以利用这个socket来通信了。

    首先浏览器发送握手信息,要求协议转变为websocket

    get / http/1.1

    host: example.com

    upgrade: websocket

    connection: upgrade

    sec-websocket-key: dghlihnhbxbszsbub25jzq==

    origin:

    服务器接收到信息后,取得其中的sec-websocket-key,将他和一个固定的字符串258eafa5-e914-47da-95ca-c5ab0dc85b11做拼接,得到的字符串先用sha1做一下转换,再用base64转换一下,就得到了回应的字符串,这样服务器端发送回的消息是这样的

    http/1.1 101 switching protocols

    upgrade: websocket

    connection: upgrade

    sec-websocket-accept: s3pplmbitxaq9kygzzhzrbk+xoo=

    这样握手就完成了,用python来实现这段握手过程的话就是下面这样。

    defhandshake(conn):

    key =none

    data = conn.recv(8192)

    ifnotlen(data):

    returnfalse

    forlineindata.split('\r\n\r\n')[0].split('\r\n')[1:]:

    k, v = line.split(': ')

    ifk =='sec-websocket-key':

    key =base64.b64encode(hashlib.sha1(v +'258eafa5-e914-47da-95ca-c5ab0dc85b11').digest())

    ifnotkey:

    conn.close()

    returnfalse

    response ='http/1.1 101 switching protocols\r\n'\

    'upgrade: websocket\r\n'\

    'connection: upgrade\r\n'\

    'sec-websocket-accept:'+ key +'\r\n\r\n'

    conn.send(response)

    returntrue

    握手过程完成之后就是信息传输了,websocket的数据信息格式是这样的。

    +-+-+-+-+-------+-+-------------+-------------------------------+

    0                   1                   2                   3

    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1

    +-+-+-+-+-------+-+-------------+-------------------------------+

    |f|r|r|r| opcode|m| payload len |    extended payload length    |

    |i|s|s|s|  (4)  |a|     (7)     |             (16/64)           |

    |n|v|v|v|       |s|             |   (if payload len==126/127)   |

    | |1|2|3|       |k|             |                               |

    +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +

    |     extended payload length continued, if payload len == 127  |

    + - - - - - - - - - - - - - - - +-------------------------------+

    |                               | masking-key, if mask set to 1 |

    +-------------------------------+-------------------------------+

    | masking-key (continued)       |          payload data         |

    +-------------------------------- - - - - - - - - - - - - - - - +

    :                     payload data continued ...                :

    + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

    |                     payload data continued ...                |

    +---------------------------------------------------------------+

    值得注意的是payload len这项,表示数据的长度有多少,如果小于126,那么payload len就是数据的长度,如果是126那么接下来2个字节是数据长度,如果是127表示接下来8个字节是数据长度,然后后面会有四个字节的mask,真实数据要由payload data和mask做异或才能得到,这样就可以得到数据了。发送数据的格式和接受的数据类似,具体细节可以去参考rfc6455,这里就不过多赘述了。

    然后在我的github上有我实现的websocket server的代码,简单使用的话是足够了,但是如果是作为应用还是需要把所有的协议的具体细节都去实现才可以。

    如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

    展开全文
  • JAVA实现WebSocket服务器

    2021-04-30 16:54:46
    简单的话可以在客户端进行ajax轮询,但对于服务器来说会有大量的无效请求,客户端一多还容易扑街,于是准备上WebSocket。 环境为Spring Boot。 思路 关于客户端 客户端连接上的时候,将该连接对象存入服务器内存中...

    背景

    最近做一个物联网相关的项目,需要让服务器主动推送消息给客户端。简单的话可以在客户端进行ajax轮询,但对于服务器来说会有大量的无效请求,客户端一多还容易扑街,于是准备上WebSocket。

    环境为Spring Boot。

    思路

    关于客户端

    客户端连接上的时候,将该连接对象存入服务器内存中的Map集合中管理,key为客户端ID,value为该客户端的WebSocket连接对象。

    由于WebSocket连接无法跨服务器,后期若扩展的话,想主动向指定客户端下发消息,只能通过中间件查询到该客户端的连接在哪台服务器后,再进行下发消息。

    关于交互数据格式

    在例如查询这种一应一答模式的操作中,依旧是走http请求,其他通知类的操作就走WebSocket。
    交互的过程使用JSON格式的字符串,根据JSON字符串中type的值进行区分通知类型。如下则是一个初始化的通知:

    {
        "type":"INIT",
        "client":"user"
    }
    

    项目依赖

    <!-- https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket -->
    <dependency>
        <groupId>org.java-websocket</groupId>
        <artifactId>Java-WebSocket</artifactId>
        <version>1.5.2</version>
    </dependency>
    

    实现

    上面这个依赖可以帮我们更好的管理WebSocket消息,只需要继承WebSocketServer类即可监听各类事件:

    public class Server extends WebSocketServer {
    
        public Server(int port) {
            super(new InetSocketAddress(port));
        }
    
        @Override
        public void onOpen(WebSocket conn, ClientHandshake handshake) {
            System.out.println("有人进来了");
        }
    
        @Override
        public void onClose(WebSocket conn, int code, String reason, boolean remote) {
    
        }
    
        @Override
        public void onMessage(WebSocket conn, String message) {
            System.out.println("收到消息:" + message);
        }
    
        @Override
        public void onError(WebSocket conn, Exception ex) {
    
        }
    
        @Override
        public void onStart() {
    
        }
    
        public static void main(String[] args) throws IOException, InterruptedException {
            Server server = new Server(8888);
            server.start();
            System.out.println("服务器端启动,端口号为:" + server.getPort());
            BufferedReader sysin = new BufferedReader(new InputStreamReader(System.in));
            while (true) {
                String in = sysin.readLine();
                server.broadcast(in);
                if (in.equals("exit")) {
                    server.stop(1000);
                    break;
                }
            }
        }
    }
    

    主要有以下五个事件:

    • onStart: 服务器启动事件
    • onOpen: 连接打开事件
    • onMessage: 接收消息事件
    • onClose: 连接关闭事件
    • onError: 连接出错事件

    前面说到的连接管理,就可以在onOpenonCloseonError这三个事件中进行管理,在有客户端连接时将WebSocket对象存入Map,而连接关闭或者连接出错时可以将客户端剔除。

    onMessage则是我们的重点,客户端发来的消息都会通过这个方法接收,接收的类型为String,因为一开始约定好了通过JSON字符串进行交互,所以可以写一个工具类,将message和Java类进行映射转换。

    更优雅的使用

    项目中肯定会存在不同的消息类型,如果全部挤到onMessage一个方法中,通过if/else的方式去判断类型进行处理,后期会显得臃肿难以维护。于是想到了SpringMVC的请求方式,把JSON数据中的type类比SpringMVC的uri,仿照@RequestMessage注解根据type路由到不同的处理方法。

    消息类型枚举

    这里存储了消息的类型,后面会将Handler都交给Spring管理,根据客户端传入的type值寻找对应的处理器。但为了避免出现Bean名字冲突的情况,故在getName方法中拼接自定义前缀,我这里用的是WebSocketBeanName:

    public enum RequestMessageTypeEnum {
        /**
         * 初始化
         */
        INIT();
    
        /**
         * 防止对应的Mapping Bean名字重复
         * @return
         */
        public String getBeanName(){
            return "WebSocketBeanName:" + this.toString();
        }
    }
    

    消息接收对象

    简单起见只保留消息类型

    @Data
    public class RequestMessage {
        /**
         * 消息类型
         */
        private RequestMessageTypeEnum messageType;
    }
    

    自定义注解

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Component
    public @interface WebSocketMapping {
        RequestMessageTypeEnum value();
    }
    

    自定义注解Bean配置别名

    由于我们是用type进行路由,为了防止type的值与Spring中其他Bean名字发生冲突,这里给WebSocketMapping注解修饰的类起别名。

    @Slf4j
    @Component
    public class WebSocketMappingRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            String[] ary = beanFactory.getBeanNamesForAnnotation(WebSocketMapping.class);
            for (String beanName : ary) {
                //通过Spring的beanName获取bean的类型
                Class<?> cls = beanFactory.getType(beanName);
                if (cls != null && cls.getAnnotations().length > 0) {
                    for (Annotation annotation : cls.getAnnotations()) {
                        if (annotation instanceof WebSocketMapping) {
                            WebSocketMapping webSocketMapping = (WebSocketMapping) annotation;
                            // 注册bean别名
                            beanFactory.registerAlias(beanName, webSocketMapping.value().getBeanName());
                        }
                    }
                }
            }
        }
    
        @Override
        public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
            if (log.isDebugEnabled()) {
                log.debug("postProcessBeanDefinitionRegistry");
            }
        }
    }
    

    配置完成后,我们就可以根据WebSocketBeanName: + Type找到对应的Handler。

    路由类

    @Component
    @Slf4j
    public class MessageRouter {
    
        private final ObjectMapper objectMapper = new ObjectMapper();
    
        private final ApplicationContext applicationContext;
    
        public MessageRouter(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
        }
    
        /**
         * 根据消息Type找到对应的处理器进行处理
         * @param conn
         * @param message
         */
        public void router(WebSocket conn, String message){
            try {
                RequestMessage requestMessage = objectMapper.readValue(message, RequestMessage.class);
                // 根据类型执行不同操作
                MessageHandler handler = applicationContext.getBean(requestMessage.getMessageType().getBeanName(), MessageHandler.class);
                handler.handle(conn, requestMessage);
            } catch (JsonParseException e){
                e.printStackTrace();
                log.error("数据包格式错误:{}", message);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    到这里环境就都搭建完成了,然后是Handler相关。

    Handler接口以及类的使用

    定义接口:

    public interface MessageHandler {
    
        /**
         * 消息时间处理器
         * @param conn 该消息的WebSocket连接对象
         * @param requestMessage 消息体
         */
        void handle(WebSocket conn, RequestMessage requestMessage);
    }
    

    具体的消息处理类(以INIT类型消息为例):

    @WebSocketMapping(RequestMessageTypeEnum.INIT)
    @Slf4j
    public class InitMessageHandler implements MessageHandler{
    
        @Override
        public void handle(WebSocket conn, RequestMessage requestMessage) {
            log.info("接收到INIT类型的消息:{}", requestMessage);
        }
    }
    
    展开全文
  • WebSocket(1)-- WebSocket API简介 WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safari,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从ch
  • webSocket部署到远程服务器遇到的坑

    千次阅读 2019-06-26 10:40:08
    昨天碰到个很奇怪的问题,我写了个webSocket通讯,但是我本机部署是好好的,部署到远程服务器上就不行。很纳闷。我就排查了下问题。 排查过程 1.首先我在代码中写死ip去连接。报302不行,这个是跨域问题。跨域是咋回...
  • 在我们配置websocket完成之后,测试时发现服务报404; 问题可以分为两个方向去找: 1、配置出现问题导致服务未能正确启动 2、链接地址输错 首先来分析一下第一点: 我是使用@ServerEndpoint注解的方式来实现...
  • websocket部署服务器连接不上

    千次阅读 2021-03-10 19:53:44
    本地项目使用websocket运行项目没问题,但是部署服务器就连接不上了,遇到错误 WebSocket connection to 'ws://ip:port/temperature/productWebSocket/9006' failed: Error during WebSocket handshake: ...
  • --websocket--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> 配置类 import ...
  • 前几天为了实现一个聊天功能,采用websocket技术,之后将后端的服务部署服务器之后,发现websocket连接不上, 之前(错误的代理) location /webSocket { proxy_pass http://myserver; } 修改后(可以使用的代理) ...
  • 这里首先说明下当websocket部署好了以后内网是可以通过内网ip进行连接访问的,然而通过公网IP无法访问,不能够成功握手,这里就有个坑了,首先我们确认防火墙关闭了或者放行了对应的端口,然后不管这怎么设置外网都...
  • windows平台上实现websocket服务器

    千次阅读 2019-05-07 21:41:23
    windows平台上实现websocket服务器
  • 基于Netty实现websocket集群部署实现方案 每天多学一点点~ 话不多说,这就开始吧… 文章目录基于Netty实现websocket集群部署实现方案1.前言2. 整体思路3. 代码demo4. 测试5.结语 1.前言 最近公司在做saas平台,其中...
  • WebSocket部署服务器外网无法连接解决方案
  • nodejs-websocket创建websocket服务器

    千次阅读 2020-11-06 14:54:52
    nodejs-websocket创建websocket服务器 首先,感谢csdn各位大佬们对创建websocket的解释! 1.安装模块 npm install nodejs-websocket 2.搭建websocket服务端 这个是一个js文件 //websocket.js // 搭建websocket...
  • Tomcat架设简单Websocket服务器

    千次阅读 2019-05-05 09:41:58
    //websocket = new WebSocket("ws://localhost:8080/web1/websocket"); websocket = new WebSocket("ws://localhost:8080/web2/ws"); } else { alert('当前浏览器 Not support websocket') } //连接发生...
  • PHP实现websocket服务器

    千次阅读 2017-06-13 13:50:00
    websocket协议 简介 WebSocket 不是一门...它应用 TCP 的 Socket(套接字),为网络应用定义了一个新的重要的能力:客户端和服务器端的双全工传输和双向通信。是继 Java applets、 XMLHttpRequest、 Adobe Flas...
  • 用户可通过SuperWebSocket来快速的构建可靠的,高性能的websocket服务器端应用程序。 和SuperSocket一样,SuperWebSocket可以控制台和windows服务的形式运行,同时它还支持直接运行在Website之内,这样更简化了...
  • 使用的WebSocket-Node模块搭建. 先谢谢那些牛人分享的代码. 第一步:安装好node.js和npm 这个就不赘述了. 在dos命令下测试   第二步:安装WebSocket-Node模块 Node.js command prompt输入命令 npm install ...
  • WebSocket部署问题

    2020-05-13 20:24:28
    web目录下新建lib,并导入tomcat8下的俩个websocket.jar包 src下直接创建一个扫描注册类server01 创建注册类server02 编写index.jsp tomcat部署 本地运行(加载页面后未做任何操作) 单机按钮后 打成war...
  • 文章目录6.1、在JDK上的客户端部署6.2、Web容器上的应用程序部署6.3、独立WebSocket服务器容器中的应用程序部署6.4、程序化服务部署6.5、WebSocket服务路径6.6、平台版本 6.1、在JDK上的客户端部署 Websocket应用...
  • 目录一、概述二、基本安装2.1 Java安装2.2 Apache Tomcat安装2.3 Eclipse EE安装三、正式部署3.1 创建一个简单java web项目3.2 服务端部署3.3 运行3.4 局域网连接Websocket 一、概述 本文针对Ubuntu系统(Win10下的...
  • vue接入websocket之ws部署https报错问题 会报错 当前页面的接口会被屏蔽掉 可以使用www等非https域名部署即可成功 下次分享wss部署到https

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,270
精华内容 6,508
关键字:

websocket服务器部署