晶片装饰画 發表於 2019-5-5 13:41:00

react加入websocket

<p>1、首先创建一个公共的组件,封装websocket</p>
<p>代码如下</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 参数: = func,
* timeout:连接超时时间
* @type {module.webSocket}
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
module.exports </span>=<span style="color: rgba(0, 0, 0, 1)">class webSocket {
    constructor(param </span>=<span style="color: rgba(0, 0, 0, 1)"> {}) {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.param =<span style="color: rgba(0, 0, 0, 1)"> param;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.reconnectCount = 0<span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.taskRemindInterval = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.isSucces=<span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    connection </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      let {socketUrl, timeout </span>= 0} = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.param;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检测当前浏览器是什么浏览器来决定用什么socket</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> ('WebSocket' <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> window) {
            console.log(</span>'WebSocket'<span style="color: rgba(0, 0, 0, 1)">);
            
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> WebSocket(socketUrl);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> ('MozWebSocket' <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> window) {
            console.log(</span>'MozWebSocket'<span style="color: rgba(0, 0, 0, 1)">);

            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MozWebSocket(socketUrl);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
            console.log(</span>'SockJS'<span style="color: rgba(0, 0, 0, 1)">);
            
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> SockJS(socketUrl);
      }
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket.onopen = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.onopen;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket.onmessage = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.onmessage;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket.onclose = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.onclose;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket.onerror = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.onerror;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket.sendMessage = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.sendMessage;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket.closeSocket = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.closeSocket;
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 检测返回的状态码 如果socket.readyState不等于1则连接失败,关闭连接</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)">(timeout) {
            let time </span>= setTimeout(() =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
               </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span>.socket &amp;&amp; <span style="color: rgba(0, 0, 255, 1)">this</span>.socket.readyState !== 1<span style="color: rgba(0, 0, 0, 1)">) {
                     </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.socket.close();
               }
               clearInterval(time);
            }, timeout);
      }
    };
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 连接成功触发</span>
    onopen = () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      let {socketOpen} </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.param;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.isSucces=<span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">连接成功将标识符改为false</span>
      socketOpen &amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> socketOpen();
    };
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 后端向前端推得数据</span>
    onmessage = (msg) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      let {socketMessage} </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.param;
      socketMessage </span>&amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> socketMessage(msg);
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 打印出后端推得数据</span>
<span style="color: rgba(0, 0, 0, 1)">      console.log(msg);
    };
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 关闭连接触发</span>
    onclose = (e) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.isSucces=<span style="color: rgba(0, 0, 255, 1)">true</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关闭将标识符改为true</span>
      console.log('关闭socket收到的数据'<span style="color: rgba(0, 0, 0, 1)">);
      let {socketClose} </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.param;
      socketClose </span>&amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> socketClose(e);
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 根据后端返回的状态码做操作</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 我的项目是当前页面打开两个或者以上,就把当前以打开的socket关闭</span>
      <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 否则就20秒重连一次,直到重连成功为止 </span>
      <span style="color: rgba(0, 0, 255, 1)">if</span>(e.code=='4500'<span style="color: rgba(0, 0, 0, 1)">){
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.socket.close();
      }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
            </span><span style="color: rgba(0, 0, 255, 1)">this</span>.taskRemindInterval = setInterval(()=&gt;<span style="color: rgba(0, 0, 0, 1)">{
                </span><span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.isSucces){
                  </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.connection();
                }</span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">{
                  clearInterval(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.taskRemindInterval)
                }
            },</span>20000<span style="color: rgba(0, 0, 0, 1)">)
      }
    };
    onerror </span>= (e) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> socket连接报错触发</span>
      let {socketError} = <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.param;
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
      socketError </span>&amp;&amp;<span style="color: rgba(0, 0, 0, 1)"> socketError(e);
    };
    sendMessage </span>= (value) =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 向后端发送数据</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span>(<span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.socket) {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.socket.send(JSON.stringify(value));
      }
    };
};</span></pre>
</div>
<p>2、在我们的react项目中引入这个公共的组件</p>
<div class="cnblogs_code">
<pre>import Socket from './index'<span style="color: rgba(0, 0, 0, 1)">;


class websocket extends React.Component {
    constructor() {
      super();
      </span><span style="color: rgba(0, 0, 255, 1)">this</span>.taskRemindInterval = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    componentDidMount </span>= () =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
      </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">    判断专家是否登录</span>
      <span style="color: rgba(0, 0, 255, 1)">this</span>.socket = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Socket({
            socketUrl: </span>'ws://123.207.167.163:9010/ajaxchattest'<span style="color: rgba(0, 0, 0, 1)">,
            timeout: </span>5000<span style="color: rgba(0, 0, 0, 1)">,
            socketMessage: (receive) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                console.log(receive);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">后端返回的数据,渲染页面</span>
<span style="color: rgba(0, 0, 0, 1)">            },
            socketClose: (msg) </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                console.log(msg);
            },
            socketError: () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span>.state.taskStage + '连接建立失败'<span style="color: rgba(0, 0, 0, 1)">);
            },
            socketOpen: () </span>=&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                console.log(</span>'连接建立成功'<span style="color: rgba(0, 0, 0, 1)">);
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 心跳机制 定时向后端发数据</span>
                <span style="color: rgba(0, 0, 255, 1)">this</span>.taskRemindInterval = setInterval(() =&gt;<span style="color: rgba(0, 0, 0, 1)"> {
                  </span><span style="color: rgba(0, 0, 255, 1)">this</span>.socket.sendMessage({ "msgType": 0<span style="color: rgba(0, 0, 0, 1)"> })
                }, </span>30000<span style="color: rgba(0, 0, 0, 1)">)
            }
      });
     重试创建socket连接
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
            </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.socket.connection();
      } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 捕获异常,防止js error</span>
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> donothing</span>
<span style="color: rgba(0, 0, 0, 1)">      }
    }

}

export </span><span style="color: rgba(0, 0, 255, 1)">default</span> websocket;</pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/houjl/p/10812519.html
頁: [1]
查看完整版本: react加入websocket