【发布时间】:2011-11-30 03:08:27
【问题描述】:
我正在尝试制作一个 Java WebSocket 服务器,没什么复杂的,只是一个丑陋的小服务器,可以使用标准定义的 api 从浏览器中尝试 websocket。
我一直在阅读协议的规范,它非常简单。我已经握手,显然它正在工作。
我用 Java 做的是:打开一个套接字,从浏览器的 JavaScript 接收来自new Websocket("ws://...") 的请求,发送服务器的响应,创建“Sec-WebSocket-Accept”。所有这些似乎都在起作用!谷歌 Chrome 开发者工具显示连接成功...(这是图片)
我还做了一个ws.onopen = function(ev){ alert("Opened!!"); 并且有效...(所以连接一定没问题吧?)。
但是现在,我正在尝试将数据从服务器发送到浏览器或浏览器发送到服务器,但没有任何反应......
要将数据从浏览器发送到服务器,我只需执行 ws.send("datos"); 并在服务器中尝试读取此内容,执行 readLine(in) 是 in = clientSocket.getInputStream();... 但什么都没有... 不工作...
为了将数据从服务器发送到浏览器,我执行了out.write(webSockFrame("data")getBytes()),但同样...浏览器中没有任何反应...在浏览器中我正在等待数据执行ws.onmessage = function(ev){....}...
(webSockFrame(string) 函数添加了标准要求的两个字节,一个在字符串的开头,一个在字符串的末尾。)
我还尝试使用 telnet 连接到服务器(以检查服务器是否工作正常),一切正常,从 telnet 和服务器发送和接收数据......
我做错了什么?
我正在使用最新版本的 Chrome (14)。
我不想搭建一个繁重的并发服务器,只是想尝试一下这项新技术。
更新:我不知道还能尝试什么...我做了一个 netstat -a 来查看连接是真的活跃还是只是 chrome 的错误,但令我惊讶的是它存在并且一直打开,直到我关闭网络服务器...我不知道为什么 send 和 ws.onmessage 不起作用...
更新二:我在 onopen 事件上更改了文本,文本更改...并且还对文本进行了 onclose 更改,当我关闭服务器时,文本更改...所以连接确实存在并且 onopen 和 onclose 完美地工作......
【问题讨论】:
-
"一个在字符串的开头和一个在字符串的末尾" - 这是旧的草稿版本。 Chrome 14 已经切换到新的草案,这实际上是一次彻底的大修。 tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 我认为您将它们混淆了-您的握手响应是正确的(新的)响应,但是消息格式已更改,您似乎尚未实现。
-
但是从浏览器到服务器我应该只是从浏览器接收数据,对吗?这并没有发生:(
-
+1 尝试自己构建它
-
@Andres:不完全是。如果您执行
ws.send("data"),那么您将在服务器上获得编码数据,您必须使用新规范中指定的算法对其进行解码。前段时间,我为此发布了一些伪代码 - 它可能有助于在服务器上解码。请注意,服务器到客户端的消息也应该采用某种格式。 stackoverflow.com/questions/7040078/… -
@pimvdb 好的,如果我在服务器上执行 ws.send("data") 获得编码数据,至少我的服务器应该能够从该套接字读取一些内容,而这不会发生。 ..我不知道为什么...我仍在研究,但是很难做到这一点...
标签: java javascript sockets websocket