1.需要引入的加包tomcat7-websocket.jar和websocket-api.jar,可以在tomcat自帶的lib目錄中找到;
2.在web.xml中加入監聽
<listener>
<listener-class>org.apache.tomcat.websocket.server.WsContextListener</listener-class>
</listener>
3.在項目中加入配置類ScanWebSocketSeverConfig.java
import javax.websocket.Endpoint;
import javax.websocket.server.ServerApplicationConfig;
import javax.websocket.server.ServerEndpointConfig;
import java.util.HashSet;
import java.util.Set;
/**
* Created by D.chen.g on 2018/4/20.
*/
public class ScanWebSocketSeverConfig implements ServerApplicationConfig {
@Override
public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> scanned) {
Set<ServerEndpointConfig> result = new HashSet<>();
return result;
}
@Override
public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scanned) {
Set<Class<?>> results = new HashSet<Class<?>>();
for (Class<?> clazz : scanned) {
if (clazz.getName().equals("com.app.struts.socket.EchoExample")) {//換成你自己websock使用類
System.out.println("find end point : " + clazz.getName());
results.add(clazz);
}
}
return results;
}
}
4.在項目中加入使用類EchoExample
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
/**
* Created by D.chen.g on 2018/4/20.
*/
@ServerEndpoint(value = "/echo")
public class EchoExample {
@OnOpen
public void openConn(Session session) throws IOException {
session.getBasicRemote().sendText("hello web socket"); // means open it
}
@OnClose
public void onClose(){
System.out.println(" connection closed ");
}
@OnMessage
public void onMessage(String message,Session session)
throws IOException, InterruptedException
{
System.out.println("***************"+message);
session.getBasicRemote().sendText(" this is message");
int sentMessage = 0;
while(sentMessage < 3){
Thread.sleep(5000);
session.getBasicRemote().sendText(" this is one mess " + sentMessage);
sentMessage++;
}
session.getBasicRemote().sendText(" message send over ");
}
}
5.在struts.xml中加入過濾
<constant name="struts.action.excludePattern" value="/ws/.*,ws://.*"></constant>
6.前端頁面test.html
<html>
<head>
<title>Web Socket Echo Test</title>
<script>
var ws = null;
var count = 0;
function setConnected(connected) {
document.getElementById('connect').disabled = connected;
document.getElementById('disconnect').disabled = !connected;
document.getElementById('echo').disabled = !connected;
}
function connect() {
var target = document.getElementById('target').value;
if (target == '') {
alert('Please select server side connection implementation.');
return;
}
if ('WebSocket' in window) {
ws = new WebSocket(target);
} else if ('MozWebSocket' in window) {
ws = new MozWebSocket(target);
} else {
alert('WebSocket is not supported by this browser.');
return;
}
ws.onopen = function () {
setConnected(true);
log('Info: WebSocket connection opened.');
};
ws.onmessage = function (event) {
log('Received: ' + event.data);
if(event.data instanceof ArrayBuffer)
{
var bytes = new Uint8Array(event.data);
alert(bytes.length + " : " + bytes[0]);
}
};
ws.onclose = function (event) {
setConnected(false);
log('Info: WebSocket connection closed, Code: ' + event.code + (event.reason == "" ? "" : ", Reason: " + event.reason));
};
}
function disconnect() {
if (ws != null) {
ws.doClose();
ws = null;
}
setConnected(false);
}
function echo() {
if (ws != null) {
var message = document.getElementById('message').value;
log('Sent: ' + message);
ws.send(JSON.stringify({'textMessage': message}));
count++
} else {
alert('WebSocket connection not established, please connect.');
}
}
function log(message) {
var echomsg = document.getElementById('echomsg');
var p = document.createElement('p');
p.style.wordWrap = 'break-word';
p.appendChild(document.createTextNode(message));
echomsg.appendChild(p);
while (echomsg.childNodes.length > 25) {
echomsg.removeChild(console.firstChild);
}
echomsg.scrollTop = console.scrollHeight;
}
document.addEventListener("DOMContentLoaded", function() {
// Remove elements with "noscript" class - <noscript> is not allowed in XHTML
var noscripts = document.getElementsByClassName("noscript");
for (var i = 0; i < noscripts.length; i++) {
noscripts[i].parentNode.removeChild(noscripts[i]);
}
}, false);
</script>
</head>
<body>
<div>
<!--xxx爲你的web項目訪問根目錄-->
<h4>URL - ws://localhost:8080/xxx/echo</h4>
<input id="target" type="text" size="40" style="width: 350px" />
</div>
<div>
<button id="connect" onclick="connect();">Connect</button>
<button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
</div>
<div>
<textarea id="message" style="width: 350px">Here is a message!</textarea>
</div>
<div>
<button id="echo" onclick="echo();" disabled="disabled">Echo message</button>
</div>
<div id="echomsg">
</div>
</body>
</html>
7.如果在發佈時使用了nginx,前端頁面連接請用服務器IP和端口訪問websock服務,實測使用域名不行。