MAC OS和cent os下使用swoole建立websocket连接服务遇到的问题
浏览数 218058
赞
(0)
MAC OS和cent os下使用swoole建立websocket连接服务遇到的问题。
一、我的本机是MAC OS系统,在本机开发一个扫码登录的功能,需要通过http连接生成一张二维码图片,并把二维码相关信息存放在redis中,同时返回生成键名的相关返回给浏览器,浏览器建立websocket长连接监控用户是否执行扫描登录,向socket服务器发送redis的生成键名的相关信息,socket服务端需要做:查询redis中是否存在该键名的缓存(未建立过或者已过期)、用户是否登录成功。
在开发过程中遇到两个问题:
Firefox浏览器中报错:
因为线上代码和本机代码一样,所以可以排除代码和前端的问题,那一定是服务器或PHP环境的问题,经测试是服务器的防火墙禁止了9502端口的访问,放开这个端口即可
一、我的本机是MAC OS系统,在本机开发一个扫码登录的功能,需要通过http连接生成一张二维码图片,并把二维码相关信息存放在redis中,同时返回生成键名的相关返回给浏览器,浏览器建立websocket长连接监控用户是否执行扫描登录,向socket服务器发送redis的生成键名的相关信息,socket服务端需要做:查询redis中是否存在该键名的缓存(未建立过或者已过期)、用户是否登录成功。
在开发过程中遇到两个问题:
- http服务端生成的键名与socket服务端生成的键名不一样,导致socket一直返回二维码不存在,经查找原因,是因为JS和PHP对浮点数精确的位数不一样,经过json_decode() 后数值有变,导致字符串不完成一致。
- 我把上面这个问题解决后,发现还是一直返回二维码不存在,折腾了半天终于找到原因,http服务器的PHP写入redis缓存后,不能马上在socket服务器读取得该数据,如果我在socket端推荐一点时间就能读取到,比如推荐一秒钟。我用的是CI框架,不知道这个延迟是PHP框架问题还是redis的问题,我没再追究,反正已经有解决方案了。
二、代码放到线上环境后,JS与websocket建立连接超时,报了这个错误
谷歌chrome浏览器中报错2个错误:
Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.
connection to 'ws://websocket.weinidai.com:9502/' failed: Error in connection
Firefox浏览器中报错:
GET websocket.weinidai.com:9502 | Aborted | websocket.weinidai.com:9502 |
因为线上代码和本机代码一样,所以可以排除代码和前端的问题,那一定是服务器或PHP环境的问题,经测试是服务器的防火墙禁止了9502端口的访问,放开这个端口即可
- vim /etc/sysconfig/iptables 开放9502端口
发现里面果然没有9502端口记录,增加一行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9502 -j ACCEPT - 重启防火墙:service iptables restart
- 查看防火墙状态 : iptables -L -n
可以看到9502端口已经在放开的列表中了
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:9502 - 使用这个使用可以看到端口当时的运行状态,启动了websocket服务就能看到记录,没有启动就看不到记录
lsof -i :9502