1. 简介
WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信—— 允许服务器主动发送信息给客户端。
webSocket 对象提供了用于创建和管理webSocket连接,以及通过该连接发送和接收数据的API 。
WebScoket的构造器方法接收一个必须的参数和一个可选的参数:
WebSocket WebSocket(in DOMString url,in optional DOMString protocols);
WebSocket WebSocket(in DOMString url,in optional[] DOMString protocols);
- url :表示要连接的url,这个url应该为响应WebSocket的地址
- protocols : 可以是单个协议,也可以是多个协议的名字的字符串数据。这些字符串用来表示自协议,这样可以让一个服务器实现多种WebSocket子协议。如果没有指定这个参数,会默认空字符串。构造方法可能抛出以下异常:
SECURITY_ERR ==>试图连接的端口被屏蔽。
2. 方法
void close(in optional unsugned long code,in optional DOMString reason);
void sent(in DOMString data);
3. 属性
属性名 | 类型 | 描述 |
---|---|---|
binaryType | DOMString | 一个字符串表示被传输二进制内容的类型,取值应当为"blob"或者"arraybuffer","blob"表示使用DOMBlob对象",arraybuffer"表示ArrayBuffer对象 |
bufferedAmount | unsigned long | 调用send()方法将多字节数据加入到队列中等待传输,但是还未发出。该值会在所有队列数据被发送后重置为 0。而当连接关闭时不会设为0。如果持续调用send(),这个值会持续增长。只读。 |
extensions | DOMString | 服务器选定的扩展 |
onclose | EventListener | 用于监听关闭事件监听器 |
onerror | EventListener | 用于监听错误事件监听器 |
onmessage | EventListener | 用于监听消息事件监听器 |
onopen | EventListener | 用于监听打开事件监听器 |
protocol | DOMString | 一个表明服务器选定的子协议名字的字符串。这个属性的取值会被取值为构造器传入的protocols参数。 |
readyState | unsigned short | 连接的当前状态。只读 |
url | DOMString | 传入构造器的URL。必须是绝对地址的URL。只读 |
4. 常量(Ready state)
常量 | 值 | 描述 |
---|---|---|
CONNECTING | 0 | 连接还没开启 |
OPEN | 1 | 连接开启准备通信 |
CLOSING | 2 | 连接正在关闭的过程中 |
CLOSED | 3 | 连接已经关闭,或者无法建立。 |
5.实例
- js
$(function(){
//建立socket连接
var sock;
var p1 = "", p2 = "";
if("https:" == document.location.protocol){
p1 = "wss://";
p2 = "https://"
}else{
p1 = "ws://";
p2 = "http://"
}
if ('WebSocket' in window) {
sock = new WebSocket(p1+"<%=basePath%>order_socket");
} else if ('MozWebSocket' in window) {
sock = new MozWebSocket(p1+"<%=basePath%>order_socket");
}
sock.onopen = function(e) {
console.log(e);
};
sock.onmessage = function(e) {
//业务逻辑
toastr.options = {
"closeButton": true,
"debug": false,
"positionClass": "toast-bottom-right",
"onclick": order,
"showDuration": "43200000",
"hideDuration": "43200000",
"timeOut": "43200000",
"extendedTimeOut": "43200000",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": "fadeIn",
"hideMethod": "fadeOut"
}
toastr.clear();
toastr.info(JSON.parse(e.data));
}
};
sock.onerror = function(e) {
console.log(e);
};
sock.onclose = function(e) {
sock.close();
}
/* ajax请求超时解决 */
$.ajaxSetup({
contentType : "application/x-www-form-urlencoded;charset=utf-8",
complete: function (XMLHttpRequest, status) {
var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus"); // 通过XMLHttpRequest取得响应头,sessionstatus,
if (sessionstatus == "timeout") {
// 如果超时就处理 ,指定要跳转的页面
alert("登录状态过期,将跳转至登录页");
window.location.href="http://<%=basePath%>login";
}
}
});
});
- Java
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
@ServerEndpoint("/websocketTest")
public class WebSocketTest {
@OnMessage
public void onMessage(String message, Session session) throws IOException, InterruptedException {
// Print the client message for testing purposes
System.out.println("Received: " + message);
// Send the first message to the client
session.getBasicRemote().sendText("This is the first server message");
// Send 3 messages to the client every 5 seconds
int sentMessages = 0;
while (sentMessages < 3) {
Thread.sleep(5000);
session.getBasicRemote().sendText("This is an intermediate server message. Count: " + sentMessages);
sentMessages++;
}
// Send a final message to the client
session.getBasicRemote().sendText("This is the last server message");
}
@OnOpen
public void onOpen() {
System.out.println("Client connected");
}
@OnClose
public void onClose() {
System.out.println("Connection closed");
}
}
网友评论