<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>WebSocket示例</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="description" content="This is my page"> </head> <body> <button onclick="subOpen();">open</button><br/> <input type="text" name="msg" id="msg"><br/> <button onclick="send();">发送</button> <div id="div"></div> </body> <script type="text/javascript"> var ws; // 就是一个通讯管道 var target = "ws://localhost:8080/WebsocketTest/echo";//服务端的url,注意以ws开头 function subOpen(){ //三个判断用于获取ws通讯管道(浏览器兼容) if('WebSocket' in window){ ws = new WebSocket(target); }else if('MozWebSocket' in window){ ws = new MozMozWebSocket(target); }else{ alert("WebSocket is not supported by this browse"); return; } //ws.onopen = function(){} 连接开启会执行方法 //ws.onclose = function(){} 断开链接会执行方法 //以上两个实际用处并很少,主要是下面的 //服务器又信息返回就执行方法 ws.onmessage=function(event){ //服务端一返回内容,就把该内容放到div标签当中 document.getElementById("div").innerHTML = event.data; //方便在控制台查看返回内容的具体信息 console.info(event); }; }; function send(){ //点击发送按钮就把输入框里的内容发送给服务器,并把输入框的内容清空 var msg = document.getElementById("msg").value; ws.send(msg); document.getElementById("msg").value = ""; }; </script> </html>
package Test; import javax.websocket.OnClose; import javax.websocket.OnError; import javax.websocket.CloseReason; import javax.websocket.EndpointConfig; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; //注解规定了访问的URL @ServerEndpoint("/echo") public class EchoSocket { /** * 客户端有链接的时候就会调用这个方法 */ @OnOpen public void open(Session session, EndpointConfig config){ System.out.println(session.getId()+"#############"); } /** * 客户端链接断开就会调用此方法 */ @OnClose public void close(Session session,CloseReason reason){ System.out.println(session.getId() + "链接关闭了"); } /** * 接收到客户端的信息 * @param msg * @param last */ @OnMessage public void message(Session session,boolean last,String msg){ System.out.println("客户端说" + msg); try { session.getBasicRemote().sendText("ni hao too"); Thread.sleep(3000);//三秒后再发送一条信息,用于验证是否实现数据实时更新 session.getBasicRemote().sendText("ni hao too twice"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** *错误监听(当没有关闭socket链接就关闭浏览器会异常) */ @OnError public void error(Session session, Throwable error){ String id = session.getId(); System.out.println("出错的session的id是" + id); } public EchoSocket(){ System.out.println("Socket对象建立"); //经过对象的建立能够知道不一样socket之间的通讯不会共享成员变量 } }