序:JSR 356:Java API for WebSocket是javaee7新推出来的一个新的特性,他相对于其它容器实现,优点是他是一个标准.容器的更新都会遵守这个标准.不需要更改代码.减少后期的维护工作量.webscoket主要的作用是用来双向即时通信.对比传统的实现可以减少很多不必要的开销.但是对IE浏览器的支持就不太好了.所以如果客户群主要是IE而且是低版本的.使用该技术就要慎重了.
参考资料:
对浏览器的支持情况:
了解以上信息过后准备开始实现一个WEBSOCKET的DEMO.
准备工具:
tomcat7+
jdk7+ (webscoket是javaee7的新特性,所以必须版本是7及以上.)
创建工程:
创建一个名为webscoket的工程.
java文件如下:
01package org.temp;
02
03import java.io.IOException;
04import java.util.Hashtable;
05import java.util.Map;
06import java.util.Set;
07import java.util.logging.Logger;
08
09import javax.websocket.CloseReason;
10import javax.websocket.CloseReason.CloseCodes;
11import javax.websocket.OnClose;
12import javax.websocket.OnError;
13import javax.websocket.OnMessage;
14import javax.websocket.OnOpen;
15import javax.websocket.RemoteEndpoint;
16import javax.websocket.Session;
17import javax.websocket.server.PathParam;
18import javax.websocket.server.ServerEndpoint;
19//注意此访问地址格式如:”ws://”+ window.location.host+”/${pageContext.request.contextPath}/game”是ws开头的,而不是以http:开头的.
20@ServerEndpoint(value =”/game”)
21public class Scoket {
22
23private Logger logger = Logger.getLogger(this.getClass().getName());
24
25static Map sessionMap =new Hashtable();
26
27@OnOpen
28public void onOpen(Session session) {
29sessionMap.put(session.getId(), session);
30}
31
32@OnMessage
33public void onMessage(String unscrambledWord, Session session) {
34broadcastAll(“message”,unscrambledWord);
35}
36/**
37* 广播给所有人
38* @param message
39*/
40public static void broadcastAll(String type,String message){
41Set> set = sessionMap.entrySet();
42for(Map.Entry i: set){
43try {
44i.getValue().getBasicRemote().sendText(“{type:'”+type+”‘,text:'”+message+”‘}”);
45}catch (Exception e) {
46e.printStackTrace();
47}
48}
49}
50
51@OnClose
52public void onClose(Session session, CloseReason closeReason) {
53sessionMap.remove(session.getId());
54logger.info(String.format(“Session %s closed because of %s”, session.getId(), closeReason));
55}
56
57@OnError
58public void error(Session session, java.lang.Throwable throwable){
59sessionMap.remove(session.getId());
60System.err.println(“session “+session.getId()+” error:”+throwable);
61}
62}
创建一个注解为:@ServerEndpoint的webscoket的服务端.供前台访问.因为想实现点其它功能.所以在广播给所有人这个方法里边加上了type以备区分
注解说明图:
接下来是jsp页面.直接上代码..
01
02pageEncoding=”UTF-8″%>
03html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
04
05
06
07
Insert title here
09
10var socket =null;
11$(function(){
12function parseObj(strData){//转换对象
13return (new Function( “return ” + strData ))();
14};
15//创建socket对象
16socket = new WebSocket(“ws://”+ window.location.host+”/${pageContext.request.contextPath}/game”);
17//连接创建后调用
18socket.onopen = function() {
19$(“#showMsg”).append(“连接成功…
“);
20};
21//接收到服务器消息后调用
22socket.onmessage = function(message) {
23var data=parseObj(message.data);
24if(data.type==”message”){
25$(“#showMsg”).append(“”+data.text+””);
26}else if(data.type==”background”){
27$(“#showMsg”).append(“系统改变背景地址,背景地址是:”+data.text+””);
28$(“body”).css(“background”,”url(“+data.text+”)”);
29}
30};
31//关闭连接的时候调用
32socket.onclose = function(){
33alert(“close”);
34};
35//出错时调用
36socket.onerror = function() {
37alert(“error”);
38};
39$(“#sendButton”).click(function() {
40socket.send($(“#msg”).val());
41});
42$(“#abcde”).click(function(){
43$.post(“${pageContext.request.contextPath}/backgroundimg”);
44});
45});
46
47
48
49
50
51
52
53
54
55
56
基本上就可以简单的实现了多人聊天功能了.或者集体换背景图片功能.
自己感兴趣的可以根据实际业务需求做一定的扩展.
等工作空下来会做进一步的进阶.再发文章出来.