WebSocket
碎语
最近几日对websocket研究了一下,我就介绍一下服务端基于java的websocket的基本用法吧。至于websocket是什么的,基本原理我就不废话了,百度的介绍很详细。
正题
客户端(浏览器)
var socket = new WebSocket("ws://localhost:8080/websocket");
socket.onopen = function(){
socket.send("i am Tanghulu");
console.log("socket is open");
}
socket.onmessage = function(msg){
console.log(msg.data);
}
socket.onerror = function(error){
console.log(error);
}
上面是创建websocket的js代码,首先建立一个WebSocket对象,在建立的过程中指定的url是服务端用来处理这个 连接的程序。当该socket顺利打开后会在控制台输出"socket is open"这句话并向服务端发送一句话"i am Tanghulu",并且每当socket收到信息后会把信息输出到控制台,当连接发生异常的时候同样会将错误信息输出到控制台。
服务端
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint(value="/websocket")
public class WebSocket{
@OnOpen
public void onOpen(Session session){
System.out.println("socket is open");
}
@OnMessage
public String onMessage(String msg,Session session){
System.out.println(msg);
return "server is received";
}
@OnClose
public void onClose(){
System.out.println("close...");
}
@OnError
public void onError(Throwable error){
System.out.println(error.getMessage());
}
}
这段服务端代码,和上面js代码基本差不多,都是在某一事件发生后将信息打印到控制台,服务端程序在收到消息的时候会将消息打印出来,并且返回一个字符串,这个字符串客户端会收到。
需要注意的是类的开始的标注中有个value="/websocket",这个指定了客户端如何定位这个服务端程序。(ws://localhost:8080/websocket),该程序需要websocket-api.jar 这个包,网上有很多资源。
关于部署
只需要将该程序直接放在你的web项目中即可,web容器会自动加载它的。
更多功能
以上介绍的是websocket如何传送字符串信息,websocket当然还可以传送二进制数据流,websocket可以直接send一个js的Blob对象或者是ArrayBuffer对象。当然在服务端接收时代码稍有变化
@OnMessage
public String onMessage(InputStream ips,Session session){
//to do code ...
}
//或者下面的方法也可以用来接受二进制信息
@OnMessage
public String onBinaryMessage(byte[] byteMessage,Session session){
//to do code ...
}
当发送的是Blob对象的时候服务器会自动调用该方法,当然如果你定义了两个OnMessage事件方法,方法名字要不一样了!