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>= () =><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(() =><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 && <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 = () =><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 &&<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) =><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>&&<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) =><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>&&<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(()=><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) =><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>&&<span style="color: rgba(0, 0, 0, 1)"> socketError(e);
};
sendMessage </span>= (value) =><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>= () =><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>=><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>=><span style="color: rgba(0, 0, 0, 1)"> {
console.log(msg);
},
socketError: () </span>=><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>=><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(() =><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> </p><br><br>
来源:https://www.cnblogs.com/houjl/p/10812519.html
頁:
[1]