当前位置:   article > 正文

React中WebSocket使用以及服务端崩溃重连_react使用ws

react使用ws

我这是即时通知推送,服务端用的node中间件:

完整版demo 请狠狠的点这里 http://download.lllomh.com/cliect/#/product/JB06452810852671

创建 node端  index.js, node index.js  执行

我这是 去拿 接口的数据再转发给前端

  1. var ws = require('nodejs-websocket');
  2. var Axios =require('axios')
  3. var server = ws.createServer(function(socket){
  4. try {
  5. // 事件名称为text(读取字符串时,就叫做text),读取客户端传来的字符串
  6. var count = 1;
  7. const token = '4jktytkUXJlvMurzs7nuE2M51b4hysvQ';
  8. socket.on('text', function(str) {
  9. // 在控制台输出前端传来的消息
  10. let tokens = JSON.parse(str)  
  11. Axios.post("http://127.0.0.1/api/api/?route=notice/check",
  12. {
  13. 'ws': 'send'
  14. },
  15. {
  16. headers: {'Authorization':tokens.token}
  17. }
  18. ).then((res)=>{
  19. console.log(res.data)
  20. socket.sendText(JSON.stringify(res.data)); //向前端回复消息
  21. })
  22. });
  23. socket.on('error', function(code) { //一定要加异常处理的这个方法,不然前端刷新服务会崩掉
  24. console.log('异常关闭', code)
  25. })
  26. } catch(e) {
  27. console.log(e)
  28. }
  29. }).listen(8185);

 

客户端发送数据以及断线重连:

定义方法:创建 ws 并复制全局

  1. constructor(props) {
  2. super(props);
  3. this.state={
  4. flag:false,
  5. webs:null,
  6. ws:{}
  7. }
  8. }
  9. getNotiveCheck=()=>{
  10. // 打开一个 web socket 这里端口号和上面监听的需一致
  11. let webSockets = new WebSocket('ws://localhost:8185/');
  12. this.setState({
  13. ws:webSockets
  14. })
  15. }

开始处理事件.正常如果服务器端服务重启 前端必须刷新才能继续链接.为了断线自动重连,.这里再链接成功之后,用flag变量标记:flag:true

也就是

  1. this.state.ws.onopen = ()=> {
  2. this.setState({
  3. flag:true
  4. })
  5. }

其实就是在触发服务器端服务关闭的时候

  1. this.state.ws.onclose = evt => {
  2. console.log("webSocket连接关闭");
  3. this.setState({
  4. flag:false
  5. })
  6. };

以及在报错的时候

  1. this.state.ws.onerror = (evt,e) => {
  2. this.setState({
  3. flag:false
  4. })
  5. console.log(evt);
  6. }

这里有个重点就是在 .onopne 中的发送的时候要判断一下 是 1  才发送,不然在报错的时候也发送会导致报错

  1. if(this.state.ws.readyState==1){
  2. this.state.ws.send(prbles_str);
  3. }

关闭的时候新建ws连接:

  1. this.state.ws.onclose = evt => {
  2. console.log("webSocket连接关闭");
  3. this.setState({
  4. flag:false
  5. },()=>{
  6. if(!this.state.flag){
  7. this.getNotiveCheck()
  8. }else {
  9. clearInterval(this.state.webs)
  10. }
  11. })
  12. };

执行的时候用定时器:

  1. componentDidMount(){
  2. this.setState({
  3. webs:setInterval(()=>{
  4. if(!this.state.flag){
  5. this.getNotiveCheck()
  6. }else {
  7. clearInterval(this.state.webs)
  8. }
  9. },3000)
  10. })
  11. }

核心代码:

  1. constructor(props) {
  2. super(props);
  3. this.state={
  4. socket:null,
  5. flag:false,
  6. webs:null,
  7. ws:{}
  8. }
  9. }
  10. getNotiveCheck=()=>{
  11. let token = localStorage.getItem('U_TOKEN')
  12. // 打开一个 web socket 这里端口号和上面监听的需一致
  13. let webSockets = new WebSocket('ws://localhost:8185/');
  14. this.setState({
  15. ws:webSockets,
  16. })
  17. // Web Socket 已连接上,使用 send() 方法发送数据
  18. this.state.ws.onopen = ()=> {
  19. this.setState({
  20. flag:true
  21. })
  22. console.log('客户端(client):与服务器的连接已打开')
  23. // 这里用一个延时器模拟事件
  24. let cont=1;
  25. setInterval(()=> {
  26. let prbles={}
  27. prbles.prble=cont+'probe'
  28. prbles.token=token
  29. let prbles_str=JSON.stringify(prbles)
  30. console.log(prbles_str)
  31. console.log(this.state.ws)
  32. if(this.state.ws.readyState==1){
  33. this.state.ws.send(prbles_str);
  34. }
  35. // ws.send(token);
  36. cont++
  37. },3000);
  38. }
  39. this.state.ws.onclose = evt => {
  40. console.log("webSocket连接关闭");
  41. this.setState({
  42. flag:false
  43. },()=>{
  44. if(!this.state.flag){
  45. this.getNotiveCheck()
  46. }else {
  47. clearInterval(this.state.webs)
  48. }
  49. })
  50. };
  51. // 这里接受服务器端发过来的消息
  52. this.state.ws.onmessage = (e)=> {
  53. let data=JSON.parse(e.data)
  54. console.log(data) //处理事情
  55. }
  56. this.state.ws.onerror = (evt,e) => {
  57. this.setState({
  58. flag:false
  59. })
  60. console.log(evt);
  61. }
  62. }
  63. }
  64. }
  65. componentDidMount(){
  66. this.setState({
  67. webs:setInterval(()=>{
  68. if(!this.state.flag){
  69. this.getNotiveCheck()
  70. }else {
  71. clearInterval(this.state.webs)
  72. }
  73. },3000)
  74. })
  75. }

 

请求图:

当然,也还有更好的写法,请多多纠正! 

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

闽ICP备14008679号