我从 https://sparktutorials.github.io/2015/11/08/spark-websocket-chat.html 中举了一个例子,并希望将其作为战争部署到Tomcat以在Web服务器上运行它。我找到了几个具有基本请求的示例(例如 get,用于 Ex.),但这种方式不适用于 Web 套接字。
public class Chat implements SparkApplication{
static Map<Session, String> userUsernameMap = new HashMap<>();
static int nextUserNumber = 1; //Used for creating the next username
public static void main(String[] args) {
new Chat().init();
}
//Sends a message from one user to all users, along with a list of current usernames
public static void broadcastMessage(String sender, String message) {
userUsernameMap.keySet().stream().filter(Session::isOpen).forEach(session -> {
try {
session.getRemote().sendString(String.valueOf(new JSONObject()
.put("userMessage", createHtmlMessageFromSender(sender, message))
.put("userlist", userUsernameMap.values())
));
} catch (Exception e) {
e.printStackTrace();
}
});
}
//Builds a HTML element with a sender-name, a message, and a timestamp,
private static String createHtmlMessageFromSender(String sender, String message) {
return article().with(
b(sender + " says:"),
p(message),
span().withClass("timestamp").withText(new SimpleDateFormat("HH:mm:ss").format(new Date()))
).render();
}
@Override
public void init() {
String route = "/chat";
webSocket(route, ChatWebSocketHandler.class);
}
}
当我运行它时,我得到
org.apache.catalina.core.StandardContext.filterStart Exception 启动过滤器 SparkFilter java.lang.IllegalStateException:WebSocket 仅在嵌入式服务器中受支持
在void init()
方法中的第 webSocket(route, ChatWebSocketHandler.class);
行。
如果 smth 取决于我的网络.xml(我没有更改它),列表在这里:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>Messenger</display-name>
<filter>
<filter-name>SparkFilter</filter-name>
<filter-class>spark.servlet.SparkFilter</filter-class>
<init-param>
<param-name>applicationClass</param-name>
<param-value>com.barbarian.messenger.Chat</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SparkFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
如果我把new SparkFilter();
放在那行之前(刚刚尝试过),我得到了
org.apache.catalina.core.StandardContext.filterStart Exception 启动过滤器 SparkFilter java.lang.IllegalStateException:WebSocket 仅在嵌入式服务器中受支持
在同一行。
有人有有效运行它的想法吗?
基于文档(至少是当前文档):
WebSockets 仅适用于嵌入式 Jetty 服务器,并且必须在常规 HTTP 路由之前定义......
http://sparkjava.com/documentation.html#websockets
这就是为什么在示例代码(https://github.com/tipsy/spark-websocket)中.xml web中看不到任何servlet配置的原因,因为嵌入式Jetty容器可以直接在main方法中运行。此外,它还使用 org.eclipse.jetty.websocket.api.* 包进行 websocket 实现。
如果您需要在Tomcat上运行websocket,则可能需要考虑在catalina软件包中使用WebSocketServlet实现。我在这里找到了示例代码(即使我还没有测试过它):https://gist.github.com/chitan/3063774。希望这有帮助。