Javascript 是否可以在浏览器中使用WebSocket等待服务器?

Javascript 是否可以在浏览器中使用WebSocket等待服务器?,javascript,websocket,Javascript,Websocket,我想在浏览器(Chrome)和Android手机之间建立连接。我有一个网页,应该一直打开,应该等待一个服务器在Android上的某个特定事件启动 我的代码: <!DOCTYPE HTML> <html> <head> <script type="text/javascript"> function waitForSocketConnection(socket, callback){ setTimeout( function

我想在浏览器(Chrome)和Android手机之间建立连接。我有一个网页,应该一直打开,应该等待一个服务器在Android上的某个特定事件启动

我的代码:

<!DOCTYPE HTML>
<html>
<head>
<script type="text/javascript">
function waitForSocketConnection(socket, callback){
    setTimeout(
        function () {
            if (socket.readyState === 1) {
                console.log("Connection is made")
                if(callback != null){
                    callback();
                }
                return;

            } else {
                console.log("wait for connection...")
                waitForSocketConnection(socket);
            }

        }, 5); // wait 5 milisecond for the connection...
}
function WebSocketTest()
{
  if ("WebSocket" in window)
  {
     alert("WebSocket is supported by your Browser!");
     // Let us open a web socket
     var ws = new WebSocket("ws://192.168.0.15:8887");
     waitForSocketConnection(ws, function() {alert('callback')})
     ws.onopen = function()
     {
        // Web Socket is connected, send data using send()
        ws.send("Message to send");
        alert("Message is sent...");
     };
     ws.onmessage = function (evt) 
     { 
        var received_msg = evt.data;
        alert("Message is received...");
     };
     ws.onclose = function()
     { 
        // websocket is closed.
        alert("Connection is closed..."); 
     };

  }
  else
  {
     // The browser doesn't support WebSocket
     alert("WebSocket NOT supported by your Browser!");
  }
}
</script>
</head>
<body>
<div id="sse">
   <a href="javascript:WebSocketTest()">Run WebSocket</a>
</div>
</body>
</html>

函数waitForSocketConnection(套接字、回调){
设置超时(
函数(){
if(socket.readyState==1){
console.log(“建立连接”)
if(回调!=null){
回调();
}
返回;
}否则{
日志(“等待连接…”)
waitForSocketConnection(套接字);
}
},5);//等待5毫秒,等待连接。。。
}
函数WebSocketTest()
{
如果(“窗口中的WebSocket”)
{
警报(“您的浏览器支持WebSocket!”);
//让我们打开一个web套接字
var ws=newwebsocket(“ws://192.168.0.15:8887”);
waitForSocketConnection(ws,函数(){alert('callback')})
ws.onopen=函数()
{
//已连接Web套接字,请使用send()发送数据
ws.send(“要发送的消息”);
警报(“消息已发送…”);
};
ws.onmessage=函数(evt)
{ 
收到的var_msg=evt.data;
警报(“收到消息…”);
};
ws.onclose=function()
{ 
//websocket已关闭。
警报(“连接已关闭…”);
};
}
其他的
{
//浏览器不支持WebSocket
警报(“您的浏览器不支持WebSocket!”);
}
}

若我在服务器未运行时单击RunWebSocket,那个么我会收到警报“连接已关闭”,即使我启动了服务器,我也不会在控制台上收到“连接已建立”。它只在服务器运行时才起作用,然后单击RunWebSocket。如何让它工作?

我想你在
WebSocketTest
中遗漏了一些东西

  • ws.onclose
    中,您应该再次调用
    ws=new WebSocket..
    以在出现错误时重新连接/断开连接
正常情况下,等待服务器可用是这样的

var ws = new WebSocket(host);
// if no connection is available or error occurred
ws.onclose = function() {
  // wait a bit and retry, don't flood the network ;)
  setTimeout( function(){ ws = new WebSocket(host); }, 100 );
}
此外,您不必显式检查就绪状态,只需将代码放入
ws.onopen


编辑:


啊。。难以形容。。请阅读注释中的示例;)

我正在做以下工作来准备我的WebSocket,以便在许多其他地方使用,而不仅仅是在WebSocket readyState更改之后:

// https://stackoverflow.com/questions/951021/what-is-the-javascript-version-of-sleep
const sleep = (ms) => {
  return new Promise(resolve => setTimeout(resolve, ms));
};

// (inside of async function)...

  const ws = new WebSocket(<webSocketServerUri>);

  let timeToConnect = 0;
  while (ws.readyState !== ws.OPEN) {
    await sleep(1);
    ++timeToConnect;
  };

  console.log('The WebSocket took ' + timeToConnect + ' milliseconds to connect.');

// (inside of async function)...
// ...
// (some other place in the code where 'ws' is accessible)...

  ws.send('my msg');

// (some other place in the code where 'ws' is accessible)...
//https://stackoverflow.com/questions/951021/what-is-the-javascript-version-of-sleep
常数睡眠=(毫秒)=>{
返回新承诺(resolve=>setTimeout(resolve,ms));
};
//(异步函数内部)。。。
const ws=new WebSocket();
设timeToConnect=0;
while(ws.readyState!==ws.OPEN){
等待睡眠(1);
++连接时间;
};
log('连接WebSocket需要'+timeToConnect+'毫秒');
//(异步函数内部)。。。
// ...
//(代码中可以访问“ws”的其他位置)。。。
ws.send('my msg');
//(代码中可以访问“ws”的其他位置)。。。

这个问题属于android吗?你在哪里得到的这个错误连接是关闭的??这只是浏览器(html5)WebSocket。我在浏览器中得到这个消息。只有服务器在Android上运行。你从Android sideno那里得到任何错误。Android服务器上没有任何动作。我想这只是JS问题