0

https://sparktutorials.github.io/2015/11/08/spark-websocket-chat.htmlから例を取得し、Tomcat に戦争としてデプロイして Web サーバーで実行したいと考えています。基本的なリクエスト (たとえば、get など) の例をいくつか見つけましたが、そのような方法は 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 例外開始フィルター SparkFilter java.lang.IllegalStateException: WebSockets は組み込みサーバーでのみサポートされます

アット ラインwebSocket(route, ChatWebSocketHandler.class);インvoid init()メソッド。

smth が私の web.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 例外開始フィルター SparkFilter java.lang.IllegalStateException: WebSockets は組み込みサーバーでのみサポートされます

同じ行で。

誰かがそれを有効に実行するという考えを持っていますか?

4

1 に答える 1

3

ドキュメントに基づく(少なくとも現在のもの):

WebSockets は組み込みの Jetty サーバーでのみ機能し、通常の HTTP ルートの前に定義する必要があります......

http://sparkjava.com/documentation.html#websockets

これが、組み込みの Jetty コンテナーをメイン メソッドで直接実行できるため、サンプル コード ( https://github.com/tipsy/spark-websocket )の web.xml にサーブレット構成が表示されない理由です。また、websocket の実装には org.eclipse.jetty.websocket.api.* パッケージを使用します。

Tomcat で websocket を実行する必要がある場合は、catalina パッケージで WebSocketServlet 実装を使用することを検討してください。ここでサンプル コードを見つけました (まだテストしていませんが): https://gist.github.com/chitan/3063774。お役に立てれば。

于 2016-02-23T08:42:01.923 に答える