【问题标题】:A demo page for latest WebSocket protocol [closed]最新 WebSocket 协议的演示页面 [关闭]
【发布时间】:2011-09-27 13:40:59
【问题描述】:

我一直在网上搜索演示 WebSocket 的简单页面。但我发现的所有示例似乎都支持旧协议,无法在 Firefox 6 和 Chrome 14 中运行。

例如:http://html5demos.com/web-socket

我只是想在某个地方看到一些可行的演示,这样我就可以确保失败的是我的代码,而不是 Web 套接字的浏览器实现。

【问题讨论】:

  • 我正在使用带有内部 WebSocket 应用程序的 Chrome 14,它工作正常。尽管您没有明确要求它,但也许您可以发布代码的一些详细信息,以便对其进行修复。
  • 其实我现在的主要问题是 Firefox。理论上我应该能够在 Firefox 中使用相同的 JavaScript 代码,只需将 WebSocket 替换为 MozWebSocket,但它似乎不起作用。可能是我的服务器有问题,或者 MozWebSocket 实现有问题。
  • 是的。下面 Cameron 建议的页面中的 javascript 使用 MozWebSocket if (typeof MozWebSocket != "undefined")。我目前正在运行 Firefox 7 Beta,它在下面 Cameron 建议的文章中给出的其他浏览器中工作得很好。我相信这也适用于您的 Chrome 14。
  • 虽然 Firefox 在关闭事件上可能有问题。我还不知道它是什么,但自动开始猜测。他们可能尚未处理关闭消息。这似乎很可能,因为下面 Cameron 建议的浏览器应用程序会打印出服务器发送回的“再见”消息以响应关闭消息(用 Chromium 试试,你会看到)。 Firefox 会抛出一个未定义的错误。
  • 顺便说一句:您应该能够通过转到关于 Google Chrome 和关于 Firefox 将您的浏览器更新到最新版本。当您这样做时,它们会自动更新。

标签: html firefox google-chrome websocket


【解决方案1】:

WEBSOCKET 服务器演示目前可与 Firefox 7 BETA 和 Chrome DEV 一起使用(现在是 16 版)。不是 Firefox 6,它使用和旧版本的 WEBSOCKET 草案协议。 (我只是想提一下,因为我看到很多来自 Firefox 6 的服务器点击 - 一定会让尝试它的人不满意。)

这是 Cameron 建议的演示代码。不确定它是否完全符合您对“简单”事物的要求。它在一个框架内运行,打印从浏览器发送的函数 showResults() 以及从服务器接收回的内容被发送到另一个框架。所有源代码都可以在 (demo server changes - check bottom of this blog article for up-to-date link to demo ... demo has a download link) 获得。否则,不应该花费大量的精力来将它(开始时)变成单页应用程序。建议您是否愿意,首先将 showResults() 指向同一页面中的 div,而不是其他页面。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
 <meta http-equiv="X-UA-Compatible" content="chrome=1">
 <title>HLL Command Center</title>
 <meta http-equiv="Content-Type" content="text/html; charset="utf-8" />
 <meta name="description"  content="HTML5 Websockets for the HLL high level logic open source project" />
 <meta name="keywords"     content="high level logic, hll, open source, artificial intelligence, agents" />
 <meta name="author"       content="Roger F. Gay" />
 <meta name="owner"        content="rogerfgay@isr.nu" />
 <meta name="copyright"    content="%a9 2011 Roger F. Gay" />
 <meta name="license"      content="Lesser General Public License (LGPL v. 2.1)" />
 <meta name="website"      content="http://hll.dev.java.net" />
 <meta name="permission"   content="restricted" />
 <meta name="created"      content="20110801" />
 <meta name="changed"      content="20110902" />
 <meta name="security"     content="public" />
 <meta name="generator"    content="skill, knowledge, and intelligence" />

<style type="text/css">
 body {background-color:Khaki;}
</style>

<script type="text/javascript">



var websocket;
var connected=false;
var frameDoc;
var appType;

function doConnect(wsURIValue) {
  if (connected) {
    showResults("<span style='color: red;'>You're already connected!</span>");
  } else {
   if (appType == "Mozilla") {
     websocket = new MozWebSocket(document.getElementById('wsURI').value);
   } else {
     websocket = new WebSocket(document.getElementById('wsURI').value);

   }
   websocket.onopen = function(evt) { onOpen(evt) };

   websocket.onclose = function(evt) { onClose(evt) };

   websocket.onmessage = function(evt) { onMessage(evt) };

   websocket.onerror = function(evt) { onError(evt) };
  }
}

function onOpen(evt) {
  connected=true;

  showResults("CONNECTED");

  doSend("WebSocket rocks!");

}

function onClose(evt) {
  connected=false;
  websocket.close();

  showResults("DISCONNECTED");
}
function doPing () {
  if (connected) {
   showResults("Not yet implemented in browser. Sending pseudo-ping message: 'Ping'.");
   websocket.send('Ping');
  } else {
    showResults("<span style='color: red;'>NOT CONNECTED: No pseudo-ping message sent.</span>");
  }
}

function onMessage(evt) {

  showResults("<span style='color: blue;'>RESP: " + evt.data + "</span>");

}

function onError(evt) {

  showResults("<span style='color: red;'>ERROR:</span> " + evt.data);

}

function doSend(message) {
  if (connected) {

    websocket.send(message);
    showResults("SENT: " + message);
  } else {
    showResults("<span style='color: red;'>NOT CONNECTED: No message sent.</span>");
  }
}
function doMultiple (message) {
 for (i=0; i<n_times; i++) {
  if (connected) {

    websocket.send(message);
    showResults("SENT: " + message);
  } else {
    showResults("<span style='color: red;'>NOT CONNECTED: No message sent.</span>");
  }
 }
}
function doClose(message) {
  if (connected) {

   showResults("CLOSING"); 

   websocket.close();
   connected=false;
  } else {
    showResults("<span style='color: red;'>NOT CONNECTED</span>");
  }

}

function showResults(message) {
  frameDoc.showResults(message);
}
function init() {
  if ((frameDoc = parent.results)) {
    document.getElementById('wsURI').value=wsUri;
    document.getElementById('message').value=mess;
    showResults("Frame communication confirmed.");
  } else {
    document.getElementById("testit1").innerHTML = "<span style='color:red'>Interframe communication failed for this webpage.</span>";
    alert("Problem printing output: This application has been tested with up-to-date versions of Chrome, Firefox, and MSIE. (May 22, 2011)");
    return;
  }
  if (typeof MozWebSocket != "undefined") { // (window.MozWebSocket)
    appType = "Mozilla";
  } else if (window.WebSocket) {
    appType = "Chrome";
  } else {
    showResults('<strong style="color: red;">ERROR: This browser does not support WebSockets.</strong>');
    return;
  }
}
function changeNTimes () {
 n_times = flowContainer.ntimes.options[document.flowContainer.ntimes.selectedIndex].value;
}
var wsUri = "ws://isr2.mine.nu/echo";
var mess = "HLL International: " + String.fromCharCode(196,197,214) + " " + String.fromCharCode(945,946,948) + " " + String.fromCharCode(20149,20150,20153) + " " + String.fromCharCode(1490,1513,1488,1458) + " " + String.fromCharCode(286,350,399);
var n_times=5;
// window.addEventListener("load", init, false);

</script>
</head>
<body onload="init()">

  <script type="text/javascript" 
   src="http://ajax.googleapis.com/ajax/libs/chrome-frame/1/CFInstall.min.js"></script>

<b>Server: </b>
<input type='button' onclick="doConnect(document.getElementById('wsURI').value)" value='Open Connection' />  
<input type='button' onclick="doClose()" value='Close Connection' />  
<input type='button' onclick="doPing()" value='Ping' /><br> 
<input type='text' style="text-align:left;" size='65' id='wsURI' /><br><br>
<span style="background-color:#CCCCCC">
<b><input type="radio" id="encoding" value="text" disabled="true" checked /> text  
<input type="radio" id="encoding" value="binary" disabled="true" /> binary</b> 
(binary not yet browser supported) <br><br>
</span>
<b>Message: </b>
<input type='button' onclick="doSend(document.getElementById('message').value)" value='Send Message to Server' /><br>
<textarea cols="50" rows="3" maxlength='260' id="message" ></textarea><br><br>
<b>Continuation (will be sent if not null): </b><br>
<textarea cols="50" rows="3" maxlength='125' id="continued" ></textarea><br><br>
<form name="flowContainer">
<input type='button' onclick="doMultiple(document.getElementById('message').value)" value='MultiMessage' /><br> 
<select name="ntimes" onchange="changeNTimes()">
  <option value="5" selected="selected">5</option>
  <option value="10">10</option>
  <option value="20">20</option>
</select>
</form>

<div id='testit3' name='testit3' style='color:blue'></div><br><br>
<div id='testit1' name='testit1' style='color:green'></div>
  <script>
   // You may want to place these lines inside an onload handler
   CFInstall.check({
     mode: "overlay",
     destination: "http://www.waikiki.com"
   });
  </script>
</body>

</html>

【讨论】:

  • 所有源代码现在都可以在:isr.nu/ws/WSJavaScript.zip
  • 我还可能会提到这样一个事实,如果有人想修改代码以便它也可以在 MSIE 中运行(现在,它只加载顶部框架然后阻塞),那将是相当不错的有。如果您接受 Google Frames 的自动下载/安装,服务器应该可以使用 MSIE。
  • 感谢您提供有关 Firefox 6 的说明。
  • 我猜你是我在过去 24 小时内看到使用 Firefox 6 请求访问服务器的人之一。我已经看到了这一点以及其他各种各样的东西。只有正确的“版本 8”才会得到响应,但我仍然会收到每次尝试的信息以及发送的信息。
  • 感谢这篇文章,我终于让我的聊天室网页可以与 Firefox 7.01 一起使用。谢谢! +1 问题 +1 对此回复。
【解决方案2】:

是的。这是 websocket 协议的最终调用版本的工作演示:版本 8 (hybi-8,9,10 ... 17)。 (演示服务器更改...有关最新链接,请参阅下面的博客文章)

这里有一篇关于它的博客文章: http://highlevellogic.blogspot.com/2011/09/websocket-server-demonstration_26.html

请注意,它使用 FIREFOX 7 BETA(不是 6,支持旧版本的协议)或 Chrome 开发通道 14 或更高版本。

(我想我们都有点困了。这是对您问题的直接、简短的回答。此外,上面列出了一些演示 dhtml 代码,如果您愿意,还可以在此处下载。)

【讨论】:

  • Firefox 7.01 和 8 Beta 存在外来字符问题。它不会影响浏览器体验,只会导致服务器上抛出错误。没什么可担心的。它继续运行。此外,Firefox 不会处理关闭时返回的消息。这也没什么好担心的。您只会在浏览器中收到错误报告。它不会停止运行。如果您运行 Chrome 开发通道 14 或更高版本,您会注意到它会收到一条“再见”消息,而不是 Firefox 显示的错误。
  • Firefox 7 不再是测试版。已经发布了。
猜你喜欢
  • 2021-03-23
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多