Java for Web学习笔记(四五):WebSocket(2)JavaScript Client
来源:互联网 发布:java最新面试题及答案 编辑:程序博客网 时间:2024/06/05 07:42
HTML5提供支持
HTML5提供WebSocket。因此支持HTML5的浏览器均能支持。
我们提供一个小例子,浏览器连接server,建立websocket连接,发送Hello消息,server收到消息后,返回一个Hello,同时每个1秒发送一个消息,发送3次后,server关闭连接。
小例子代码
完整代码如下,我们再分片段学习。
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Chapter 10: WebSocket</title><script language="javascript" type="text/javascript"> var output; function init() { output = document.getElementById("output"); } function testWebSocket(){ var connection = new WebSocket('ws://' + window.location.host + '/chapter10/test/mytest'); connection.onopen = function(/*event*/) { writeToScreen('CONNECTED'); connection.send("Hello"); } connection.onclose = function(event) { if(!event.wasClean) writeToScreen('<span style="color: red;">Abnormal disconnected:</span> ' + event.code + ': ' + event.reason); else writeToScreen('DISCONNECTED'); } connection.onerror = function(event) { writeToScreen('<span style="color: red;">ERROR:</span> '+ event.data); } connection.onmessage = function(event) { writeToScreen('<span style="color: blue;">RESPONSE: '+ event.data+'</span>'); } } function writeToScreen(message) { var pre = document.createElement("p"); pre.style.wordWrap = "break-word"; pre.innerHTML = message; output.appendChild(pre); } window.addEventListener("load", init, false); </script></head><body> <a href="javascript:void 0;" onclick="testWebSocket();">Test WebSocket</a><br /> <div id="output"></div></body></html>
例子很短,除了testWebScoket()之外,其余的是提供一个添加内容的显示。
发起WebSocket
/* 如果是本地测试,下面的语句将发起一个URL为ws://localhost:8080/chapter10/test/mytest的webSocket。*/var connection = new WebSocket('ws://' + window.location.host + '/chapter10/test/mytest');/* 同时给出Sec-WebSocket-Protocol: chat */var connection = new WebSocket('ws://www.example.com/chat', 'chat');/* 设置Sec-WebSocket-Protocol: chat.v1,char.v2 */var connection = new WebSocket('ws://www.example.com/chat', {'chat.v1','chat.v2'});
状态触发
WebSocket提供readyState状态来获取连接状态,分别是CONNECTING (0), OPEN (1),CLOSING (2) 或 CLOSED (3)if(connection.readyState == WebSocket.OPEN) { //do something }
但很少采用这种方式,一般使用状态触发,也就是例子中的:
//onopen是readyState从CONNECTING转为OPEN时触发,参数event没有任何实质有效的信息,可以不写connection.onopen = function(event) { }/* onclose是状态readyState从CLOSING转包为CLOSED时触发,event包括wasClean, code,和reason。 code可以在 RFC 6455的7.4中查看(http://tools.ietf.org/html/rfc6455#section-7.4) code=1000是正常,其他均是异常 */connection.onclose = function(event) { }/* onerror的event的data是错误的对象,通常是String, error只包括客户端的错误,protocol errors和连接关闭的错误 */connection.onerror = function(event) { }/* onmessage的event也包含data属性,对于data: 如果是消息是text就是String, 如果消息是二进制,如果webSocket的binaryType是blob则是Blob;如果binaryType是arraybuffer则是Arraybuffer 我们可应在创建WebSocket对象后设置binaryType,如: var connection = new WebSocket('ws://www.example.net/chat'); connection.binaryType = 'arraybuffer'; */connection.onmessage = function(event) { }
发送和关闭
WebSocket对象提供send()和close()两个方法进行发送和关闭。
对于send(),内容可以是string, Blob, ArrayBuffer或者ArrayBufferView。下面是一个browser定期发送消息的例子
/* send: 单一参数,可以是 string, Blob, ArrayBuffer, or ArrayBufferView * WebSocket有一个参数bufferedAmount表示之前的send仍有多少数据等待发送给server(TCP的特性), * 我们可以选择不理会,继续send,或者等待上次全部send完再send。 * 下面的例子是定期每50ms发送更新内容,如果webSocket的状态发生变化,停止定期处理,如果webSocket上次仍有内容在等待发送,就再等50ms。 */connection.onopen = function() { var intervalId = window.setInterval(function() { if(connection.readyState != WebSocket.OPEN) { window.clearInterval(intervalId); return; } if(connection.bufferedAmount == 0) connection.send(updatedModelData); }, 50);}
close可以带有可选的close code,缺省为1000(正常关闭),和一个可选的string reason(第二个参数,缺省为blank)
相关链接: 我的Professional Java for Web Applications相关文章
0 0
- Java for Web学习笔记(四五):WebSocket(2)JavaScript Client
- Java for Web学习笔记(四七):WebSocket(4)Java Client和二进制消息
- Java for Web学习笔记(四六):WebSocket(3)Java Server
- Pro Android学习笔记(四五):Dialog(2):DialogFragment
- Java for Web学习笔记(四四):WebSocket(1)演化历程
- Java for Web学习笔记(四八):WebSocket(5)encoder,decoder和configurator
- Java for Web学习笔记(九十):消息和集群(5)利用websocket实现订阅和发布(上)
- Java for Web学习笔记(七二):Service和Repository(7)在Spring框架中使用WebSocket
- java web学习笔记(javascript继承)
- Java for Web学习笔记(九一):消息和集群(6)利用websocket实现订阅和发布(下)
- Java for Web学习笔记(二):Web Containers
- [Java] Netty Websocket Server Javascript Client
- [Java] Netty Websocket Server Javascript Client
- Android学习笔记(四五):互联网通信-HttpClient、XML解析(W3C)
- Android学习笔记(四五):互联网通信-HttpClient、XML解析(W3C)
- Pro Android学习笔记(一四五):触摸屏(4):手势
- Pro Android学习笔记(一四五):触摸屏(4):手势
- Vert.x学习笔记(二) Vert.x Web Client
- Nginx访问ftp目录时权限问题
- Python网络爬虫入门(五)—— 巧用抓包,爬遍SCU玻璃杯事件所有神回复
- 中间自适应的三列布局
- CC2530基础实验之采集数字量传感器值
- 修改配置,删除文件前提示
- Java for Web学习笔记(四五):WebSocket(2)JavaScript Client
- appname is not translated in en english
- ubuntu 16 安装sublime
- 2005 第几天?
- CC2530基础实验之采集光照模拟量控制LED状态
- STM32CubeMX 4 解锁UART模块
- class net.sf.cglib.core.DebuggingClassWriter has interface org.objectweb.asm.ClassVisitor as super c
- CC2530基于寄存器实现无线收发
- JavaScript获取DOM元素的11种方法总结