WebSocket服务器端
WebSocketServer 代码:
packagecom.bing.biz.websocket;importjava.io.IOException;importjavax.websocket.OnClose;importjavax.websocket.OnError;importjavax.websocket.OnMessage;importjavax.websocket.OnOpen;importjavax.websocket.Session;importjavax.websocket.server.PathParam;importjavax.websocket.server.ServerEndpoint;//该注解用来指定一个URI,客户端可以通过这个URI来连接到WebSocket。类似Servlet的注解mapping。无需在web.xml中配置。
@ServerEndpoint("/webSocketServer/{userId}")public classWebSocketServer {/*** 连接建立成功调用的方法
*@paramsession 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
*@throwsIOException*/@OnOpenpublic void onOpen(@PathParam("userId") String userId,Session session) throwsIOException{/*if(userId!=null){
if(!SocketUtils.hasConnection(userId)){
SocketUtils.put(userId,session);
}
else{
//相同用户只允许在一个地方登录(网页版内部判断)。
SocketUtils.sendMessage(userId,"forcelogout","该用户已在其他地方登录,此次登录将被强制退出。",0,"");
SocketUtils.remove(userId,session.getId());
SocketUtils.put(userId,session);
}
}*/System.out.println("Client connected "+userId);
}/*** 连接关闭调用的方法*/@OnClosepublic void onClose(@PathParam("userId") String userId,Session session)throwsIOException{//SocketUtils.remove(userId,session.getId());
System.out.println("Connection closed");
}/*** 收到客户端消息后调用的方法
*@parammessage 客户端发送过来的消息
*@paramsession 可选的参数
*@throwsIOException*/@OnMessagepublic void onMessage(@PathParam("userId") String userId,String message, Session session) throwsIOException {//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){
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");
}/*** 发生错误时调用
*@paramsession
*@paramerror*/@OnErrorpublic voidonError(Session session, Throwable error){
error.printStackTrace();
}
}
你可能已经注意到我们从 javax.websocket包中引入了一些类。
@ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端。注解的值将被用于监听用户连接的终端访问URL地址。
onOpen 和 onClose 方法分别被@OnOpen和@OnClose 所注解。这两个注解的作用不言自明:他们定义了当一个新用户连接和断开的时候所调用的方法。
onMessage 方法被@OnMessage所注解。这个注解定义了当服务器接收到客户端发送的消息时所调用的方法。注意:这个方法可能包含一个javax.websocket.Session可选参数(在我们的例子里就是session参数)。如果有这个参数,容器将会把当前发送消息客户端的连接Session注入进去。
本例中我们仅仅是将客户端消息内容打印出来,然后首先我们将发送一条开始消息,之后间隔5秒向客户端发送1条测试消息,共发送3次,最后向客户端发送最后一条结束消息。
WebSocket客户端
index.jsp代码:
Stringpath=request.getContextPath();StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%>
Testing websockets