39,084
社区成员
发帖
与我相关
我的任务
分享
public class InitServlet extends HttpServlet {
private static final long serialVersionUID = -1936532122758235837L;
private static List<MyWebSocket> socketList;
public void init(ServletConfig config) throws ServletException {
InitServlet.socketList = new ArrayList<MyWebSocket>();
super.init(config);
System.out.println("Server start============");
}
public static synchronized List<MyWebSocket> getSocketList() {
return InitServlet.socketList;
}
}
然后写一个Servlet处理请求,这个Servlet就返回一个WebSocket对象:
public class MyWebSocketServlet extends WebSocketServlet {
private static final long serialVersionUID = -7302427588920888589L;
@Override
public WebSocket doWebSocketConnect(HttpServletRequest request, String arg1) {
return new MyWebSocket();
}
}
最后实现WebSocket,循环InitServlet中的List,给所有客户端发送消息:
public class MyWebSocket implements OnTextMessage {
private Connection conn;
/* (non-Javadoc)
* @see org.eclipse.jetty.websocket.WebSocket#onClose(int, java.lang.String)
* 一个客户端断开时,从List中移除
*/
@Override
public void onClose(int arg0, String arg1) {
InitServlet.getSocketList().remove(this);
System.out.println("onClose==========================");
}
/* (non-Javadoc)
* @see org.eclipse.jetty.websocket.WebSocket#onOpen(org.eclipse.jetty.websocket.WebSocket.Connection)
* 一个客户端连上来时,将它加入List
*/
@Override
public void onOpen(Connection conn) {
// 如果客户端在这个MaxIdleTime中都没有活动,则它会自动结束
System.out.println("onOpen=========================="+conn.getMaxIdleTime());
this.conn = conn;
InitServlet.getSocketList().add(this);
}
/* (non-Javadoc)
* @see org.eclipse.jetty.websocket.WebSocket.OnTextMessage#onMessage(java.lang.String)
* 一个客户端发送数据后,触发它自己的onMessage方法,在这个方法里给所有在线的客户端发送这条消息
*/
@Override
public void onMessage(String data) {
System.out.println("~~~~~~~~~~" + data);
List<MyWebSocket> socketList = InitServlet.getSocketList();
for (MyWebSocket socket : socketList) {
try {
socket.getConn().sendMessage(data);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
}
好,服务器端代码展示完毕,接下来是前端HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Chart</title>
<script type="text/javascript" src="../../js/jquery-1.7.1.min.js"></script>
<script type="text/javascript">
var ws = null;
function startWebSocket() {
if (!window.WebSocket) alert("WebSocket not supported by this browser!");
// 创建WebSocket
ws = new WebSocket("ws://localhost:8080/html5chart/mywebsocket.do");
// 收到消息时在消息框内显示
ws.onmessage = function(evt) {
$('#msgBox').append(evt.data);
$('#msgBox').append('</br>');
};
// 断开时会走这个方法
ws.onclose = function() {
alert('close~~~~~~~');
};
// 连接上时走这个方法
ws.onopen = function() {
alert('open~~~~~~~~');
};
}
// 发送消息
function sendMsg() {
var data = document.getElementById('msgSendBox').value;
ws.send(data);
document.getElementById('msgSendBox').value = '';
}
</script>
</head>
<body onload="startWebSocket();">
<div id="msgBox" style="width:400px;height:300px;border:1px solid #000000">
</div>
<textarea id="msgSendBox" rows="5" cols="32"></textarea>
<input type="button" value="send" onclick="sendMsg()"></input>
</body>
</html>
最后附上web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>html5test</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>initServlet</servlet-name>
<servlet-class>lhc.init.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>mywebsocket</servlet-name>
<servlet-class>lhc.websocket.MyWebSocketServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mywebsocket</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>