【WebSocket】解决WebSocket 服务器部署出现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 拾了起来,感谢您的阅读,希望对您有帮助~

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
部署 WebSocket 服务器通常有两种方法: 1. 将 WebSocket 服务器直接部署在应用服务器中,如 Tomcat、Jetty 等,这种方式需要在应用服务器中添加 WebSocket 支持的插件或者模块。 2. 使用独立的 WebSocket 服务器,如 Netty、Undertow 等,这种方式需要将 WebSocket 服务器独立部署,并将 WebSocket 服务器和应用服务器进行集成。 以下是基于 Spring Boot 的 WebSocket 服务器部署步骤: 1. 添加 Spring Boot WebSocket 依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> ``` 2. 创建 WebSocket 配置类,并添加 @EnableWebSocket 注解: ``` @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/websocket").setAllowedOrigins("*"); } } ``` 3. 创建 WebSocket 处理器: ``` public class MyWebSocketHandler extends TextWebSocketHandler { @Override public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { String payload = message.getPayload(); session.sendMessage(new TextMessage("Received: " + payload)); } } ``` 4. 在应用程序中注入 WebSocket 处理器: ``` @Controller public class WebSocketController { @Autowired private MyWebSocketHandler webSocketHandler; @GetMapping("/websocket") public String websocket() { return "websocket"; } } ``` 5. 编写前端页面,使用 WebSocket 进行连接: ``` var socket = new WebSocket('ws://localhost:8080/websocket'); socket.onmessage = function(event) { console.log('Received: ' + event.data); } socket.send('Hello, Server!'); ``` 6. 运行应用程序,并访问 http://localhost:8080/websocket 页面,打开浏览器控制台查看 WebSocket 连接状态。 以上是基于 Spring Boot 的 WebSocket 服务器部署步骤,具体实现可以根据自己的需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的大白啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值