動作しません。私はSO_KEEPALIVE
、つまりSO_KEEPALIVE
を設定しても動作しません!SO_KEEPALIVEが、私はこのライブラリを使用
<html><head><meta charset="UTF-8"/><title>WebSocket</title>
<script type="text/javascript">
var socket;
function setupWebSocket() {
var host = "ws://XXX:9000/";
try {
socket = new WebSocket(host);
var start = (new Date()).getTime();
socket.onclose = function(msg) {
var secs = (new Date()).getTime() - start;
alert("disconnected after "+(secs/1000)+" sec");
};
}
catch(ex){
alert(ex);
}
}
</script>
</head>
<body onload="setupWebSocket()">
</body>
</html>
変なふうに、同様のコードはPHPで動作しない:私はテストのために、次のHTMLを使用し
#!/usr/bin/python
import socket
from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket
class MyWebSocket(WebSocket):
def handleConnected(self):
print(self.address, 'connected')
self.client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
#self.client.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 3600)
#self.client.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 3600)
self.client.settimeout(3600)
class MyWebSocketServer(SimpleWebSocketServer):
def _decorateSocket(self, sock):
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
#sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 3600)
#sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 3600)
sock.settimeout(3600)
print("socket decorated: ", sock.getsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE))
return sock
server = MyWebSocketServer('', 9000, MyWebSocket)
server.serveforever()
。
キープアライブがご使用のサーバーで構成されていない可能性があります。私はfreebsdをチェックする方法を知らない。 PHPがもちろん動作する理由はわかりません...私がチェックするものを考えています。 – tdelaney
キープアライブは、接続または受け入れがネゴシエートされているときなどの特定の過渡状態では設定できないという点で、奇妙です。これは、イベントで実行される非同期プロトコルでは問題になる可能性があります。いくつかのデータが到着するまでセットを遅らせることができますが、テストコードは何かを送る必要があります。 – tdelaney
TCP keep aliveは、接続を開いたままにするのではなく、クリーンシャットダウンが行われなかった壊れた接続を早期に検出するためのものです。 –