在IBM bluemix中,即使我的服务器代码没有启动任何关闭,我的节点客户端也会关闭其websocket连接。
我的服务器端代码如下:
app.ws('/problemUpdate', function(ws, req) {
// if we have the maximum number of clients, remove the oldest
if (clients.length>MAX_CLIENTS){
ws=clients.pop();
ws.close();
}
clients.unshift(ws);
ws.on('close', function(msg) {
// on close, remove clients
for (var i = 0; i < clients.length; i++) {
if(clients[i]==ws){
console.log("removing");
clients.splice(i,1);
}
}
});
ws.on('message', function(msg) {
if (readyToSend(ws)){
ws.send(ws);
}
});
// listen the event
eventEmitter.on('updateProblem', function(updatedProblem){
//Broadcast to all clients
console.log("Total Clients: "+clients.length);
for (var i = 0; i < clients.length; i++) {
var client = clients[i];
if (readyToSend(client)){
client.send(updatedProblem);
}
}
});
});
我的客户端websocket相关代码如下:
updateWebsocket(webSocketProblemUpdate);
function updateWebsocket(socket){
socket.onopen = function(){
console.log("Connection Opened");
}
socket.onclose = function(){
}
socket.onerror = function(evt){
console.log("The following error occurred: " + evt.data);
}
socket.onmessage = function(evt){
var jsonProblem = JSON.parse(evt.data);
var problemName = jsonProblem.envelope.problemName;
delete jsonProblem["envelope"];
var option = document.createElement('option');
option.text=problemName;
option.value=problemName;
var alreadyAdded=false;
[].forEach.call( document.getElementById('problems') , function(elm){
if(elm.value==option.value && elm.text==option.text){
//if(elm.text==option.text){
alreadyAdded=true;
// update the content of an already added scenario
accumulatedJsonProblems[problemName]=JSON.stringify(jsonProblem);
$('.problems').change();
}
})
if (!alreadyAdded){
accumulatedJsonProblems[problemName]=JSON.stringify(jsonProblem);
var select = $("#problems")[0];
select.add(option,$('#problems').children('option').length);
document.getElementById('problems').value=problemName;
$('.problems').change();
console.log("The following data was received:" + JSON.stringify(jsonProblem));
}
}
}
关于什么是关闭我的网络套接字的任何线索?
谢谢, 亚伦
答案 0 :(得分:1)
经过一番研究,我发现IBM bluemix每2分钟关闭一次连接。实施了安全标准。为了解决这个问题,我每隔5分钟从客户端重新打开websocket,并重新打开客户端关闭。
//refresh the websocket every 5 minutes
setInterval(function() {
console.log("Interval expired, refreshing websocket");
// only closing because the on close method automatically opens a new websocket
webSocketProblemUpdate.close();
}, 300000);
socket.onclose = function(){
console.log("Connection Closed");
window.WebSocket = window.WebSocket || window.MozWebSocket;
webSocketProblemUpdate = new WebSocket("ws://"+window.document.location.host+"/problemUpdate");
updateWebsocket(webSocketProblemUpdate);
}
干杯, 亚伦