WebSocket无法连接问题

本文探讨了在使用ROSbridge时遇到的WebSocket连接问题,包括服务器IP变更导致的连接失败及防火墙限制。解决方法包括设置服务器IP为静态,以及调整防火墙设置允许相应端口访问。同时,介绍了WebSocket的建立过程,包括HTTP升级握手。尽管建立了连接,但更换服务器端口后仍存在抓取不到请求与回应数据的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

最近在研究rosbridge,其原理如下图,浏览器与rosbridge server也是通过WebSocket连接的,但发现有连接不上的情况。
在这里插入图片描述


原因:

情况 1: 做服务器的PC IP地址变更,导致原IP连接不上。是因为做服务器的PC用了DHCP自动分配IP的方式,自动分配的IP有一定的时限,超过一定时限后变更IP。改为手动设置IP,设为固定IP地址可以解决此问题。
情况2: 有一台PC做服务器,发现无论如何都连接不上,发现是防火墙的原因,防火墙只开放了有限的端口给外部访问,通过关闭防火墙或者开放要访问的接口后,该问题得到解决。

WebSocket握手阶段,client端发送http GET请求,如果服务器防火墙进行了拦截,将无法发出此请求,client端或者server端都将抓不到此http请求数据

CURL工具发送http请求
CURL 发送http请求


WebSocket协议

WebSocket并不是全新的协议,而是利用了HTTP协议来建立连接。我们来看看WebSocket连接是如何创建的。

首先,WebSocket连接必须由浏览器发起,因为请求协议是一个标准的HTTP请求,格式如下:

GET ws://localhost:3000/ws/chat HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Origin: http://localhost:3000
Sec-WebSocket-Key: client-random-string
Sec-WebSocket-Version: 13

该请求和普通的HTTP请求有几点不同:

GET请求的地址不是类似/path/,而是以ws://开头的地址;
请求头Upgrade: websocket和Connection: Upgrade表示这个连接将要被转换为WebSocket连接;
Sec-WebSocket-Key是用于标识这个连接,并非用于加密数据;
Sec-WebSocket-Version指定了WebSocket的协议版本。

随后,服务器如果接受该请求,就会返回如下响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: server-random-string

该响应代码101表示本次连接的HTTP协议即将被更改,更改后的协议就是Upgrade: websocket指定的WebSocket协议。
现在,一个WebSocket连接就建立成功,浏览器和服务器就可以随时主动发送消息给对方。消息有两种,一种是文本,一种是二进制数据。通常,我们可以发送JSON格式的文本,这样,在浏览器处理起来就十分容易。

来源: WebSocket


wireshark抓取到的数据

WebSocket握手阶段,发出的请求与回应信息
在这里插入图片描述
请求:
在这里插入图片描述
回应:
在这里插入图片描述
遗留问题:
更换服务器端口后,可以建立连接,但是抓取不到请求与回应数据,暂无解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值