import React from 'react';
let websock = null
let lockReconnect = false
let timeout = 1000
let timeoutObj = null
let serverTimeoutObj = null
let timeoutnum = null
let outdated = false
class Websoket extends React.Component {
constructor (props) {
super(props);
}
componentWillUnmount () {
this.websocketclose();
}
componentWillReceiveProps(nextProps) {
console.log(nextProps,'nextPropsnextProps',this.props)
if(nextProps.outdated == false || nextProps.success == false){
outdated = false
this.initWebSocket();
}
}
componentDidMount(){
outdated = this.props.outdated
}
initWebSocket = () => {
try {
if(!this.props.userId && !this.props.uid ){
console.log('无工号')
return
}
const wsuri = global.websocketUrl+this.props.uid
websock = new WebSocket(wsuri);
websock.onopen = this.websocketonopen;
websock.onerror = this.websocketonerror;
websock.onmessage = this.websocketonmessage;
} catch (e) {
console.log("报错", e);
}
}
reconnect = () =>{
if(outdated == true){
return false
}
var that = this;
if(lockReconnect) {
return;
};
lockReconnect = true;
timeoutnum && clearTimeout(timeoutnum);
timeoutnum = setTimeout(function () {
that.initWebSocket();
lockReconnect = false;
},5000);
}
reset = () =>{
var that = this;
clearTimeout(timeoutObj);
clearTimeout(serverTimeoutObj);
that.start();
}
start = () => {
var self = this;
timeoutObj && clearTimeout(timeoutObj);
serverTimeoutObj && clearTimeout(serverTimeoutObj);
timeoutObj = setTimeout(function(){
console.log(websock.readyState,'websock.readyState')
if (websock.readyState == 1) {
let msg = self.props.uid+'|'+self.props.userId
console.log(msg)
websock.send(msg);
}else{
self.reconnect();
}
serverTimeoutObj = setTimeout(function() {
websock.close();
},5000);
}, timeout)
}
websocketonopen = () => {
console.log('链接成功')
this.start();
}
websocketonerror = (e) =>{
console.log(e,"WebSocket连接发生错误");
this.reconnect();
}
websocketclose = (e) =>{
console.log('连接关闭');
this.reconnect();
}
websocketonmessage = (event) => {
this.props.sendStatus(event.data)
if(event.data == 'outdated'){
outdated = true
websock.close();
}else if( event.data == 'success'){
let msg = this.props.uid+'|'+this.props.userId+'|'+'success'
websock.send(msg);
outdated = true
websock.close();
}else {
outdated = false
this.reset();
}
}
render = () => {
return <></>
}
}
export default Websoket;