网上查了好多资料。试了很多方式都不成功。
记录下成功的方法,我的jetty版本是9.4.9.v20180320:
ContextHandlerCollection contexts = new ContextHandlerCollection();
// WebSocket启用
ContextHandler contextHandler = new ContextHandler();
contextHandler.setContextPath("/ws");
contextHandler.setHandler(new MyWebSocketHandler());
contexts.addHandler(contextHandler);
WebAppContext webAppContext = new WebAppContext("WebRoot", "/");
//.....
server.setHandler(contexts);
try {
server.start();
logger.info("Jetty Server 启动成功。" + ConfigUtil.getValue("port"));
server.join();
} catch (Exception e) {
e.printStackTrace();
logger.error(e.getMessage());
}
关键点在与contexts.addHandler(contextHandler);要在contexts.addHandler(webAppContext);之前。
即contextHandler要在webAppContext之前。
MyWebSocketListener.java
package com.xpl.startup.websocket;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketListener;
public class MyWebSocketListener implements WebSocketListener {
private Session session;
@Override
public void onWebSocketConnect(Session session) {
System.out.println("onWebSocketConnect->"+session.getRemoteAddress());
this.session = session;
}
//发送String
@Override
public void onWebSocketText(String message) {
System.out.println("onWebSocketText");
if (session.isOpen()) {
// echo the message back
session.getRemote().sendString("echo msg->m"+message , null);
}
}
//发送byte[]
@Override
public void onWebSocketBinary(byte[] payload, int offset, int len) {
System.out.println("onWebSocketBinary");
}
@Override
public void onWebSocketError(Throwable cause) {
System.out.println("Error->" + cause.getMessage());
}
@Override
public void onWebSocketClose(int statusCode, String reason) {
System.out.println("onWebSocketClose");
this.session = null;
}
}
MyWebSocketHandler.java
package com.xpl.startup.websocket;
import org.eclipse.jetty.websocket.server.WebSocketHandler;
import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
public class MyWebSocketHandler extends WebSocketHandler
{
@Override
public void configure(WebSocketServletFactory factory)
{
// 设置超时
factory.getPolicy().setIdleTimeout(10000);
// 注册
factory.register(MyWebSocketListener.class);
}
}
然后启动程序。
客户端访问连接:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script type="text/javascript">
function WebSocketTest()
{
if ("WebSocket" in window)
{
//alert("您的浏览器支持 WebSocket!");
// 打开一个 web socket
var ws = new WebSocket("ws://localhost:8080/ws/getsingle/");
ws.onopen = function()
{
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("发送数据");
alert("数据发送中...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert("数据已接收...");
};
ws.onclose = function()
{
// 关闭 websocket
//alert("连接已关闭...");
};
}
else
{
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
}
</script>
</head>
<body>
<div id="sse">
<a href="javascript:WebSocketTest()">运行 WebSocket</a>
</div>
</body>
</html>