-1

javax.websocket でチャットを作成しようとしています。私はグレイルを使用しています。3.0

これは私のコントローラーです

package chatting

import javax.websocket.server.ServerEndpoint;
import javax.websocket.OnMessage;

@ServerEndpoint("/echo")
public class WebsocketHomeController {

    def index() { }

    @OnMessage


    public String echo(String incomingMessage) {
            return "I got this (" + incomingMessage + ")"
            + " so I am sending it back !";
        }
    }

これは私の index.gsp です

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <title>Web Socket JavaScript Echo Client</title>
    <script language="javascript" type="text/javascript">
        var echo_websocket;
        function init() {
            output = document.getElementById("output");
        }
        function send_echo() {
            var wsUri = "ws://192.168.1.2:8080/WebsocketHome/echo";
            writeToScreen("Connecting to " + wsUri);
            echo_websocket = new WebSocket(wsUri);
            echo_websocket.onopen = function (evt) {
                writeToScreen("Connected !");
                doSend(textID.value);
            };
            echo_websocket.onmessage = function (evt) {
                writeToScreen("Received message: " + evt.data);
                echo_websocket.close();
            };
            echo_websocket.onerror = function (evt) {
                writeToScreen('<span style="color: red;">ERROR:</span> '
                + evt.data);
                echo_websocket.close();
            };
        }
        function showErrorInfo(e) {
            alert('Error connecting socket'+e);
        }

        function doSend(message) {
            echo_websocket.send(message);
            writeToScreen("Sent message: " + message);
        }
        function writeToScreen(message) {
            var pre = document.createElement("p");
            pre.style.wordWrap = "break-word";
            pre.innerHTML = message;
            output.appendChild(pre);
        }
        window.addEventListener("load", init, false);
    </script>
</head>
<body>
    <h1>Echo Server</h1>
    <div style="text-align: left;">
        <form action="">
            <input onclick="send_echo()" value="Press to send"
                   type="button">
            <input id="textID" name="message" value="Hello Web Sockets"
                   type="text">
            <br>
        </form>
    </div>
    <div id="output"></div>
</body>
</html>

これが結果です..

ここに画像の説明を入力

なぜこのエラーが発生するのかわかりません...

私はこのように私のコードをデバッグしようとしました..

public String echo(String incomingMessage) {
println "this is runing"
return "I got this (" + incomingMessage + ")"
+ " so I am sending it back !";
}

次に、コンソールログに「これは実行中です」と表示されます

どうすればいいですか?

4

1 に答える 1

0

Grails 3 でリスナーを追加するには:

  1. doWithSpring クロージャを ìnit/appName/Application.groovy に追加します

https://github.com/vahidhedayati/testwschatapp/blob/master/grails-app/init/testwschatapp/Application.groovy#L7-L11

Closure doWithSpring() {
    {->
        myChatConfig DefaultChatConfig
    }
}

grails-app/init/{appname}/DefaultChatConfig.groovy にファイルを作成します

https://github.com/vahidhedayati/testwschatapp/blob/master/grails-app/init/testwschatapp/DefaultWsChatConfig.groovy

package myappName

import path.to.WebsocketHomeController

import org.springframework.boot.context.embedded.ServletContextInitializer
import org.springframework.context.annotation.Bean

import javax.servlet.ServletContext
import javax.servlet.ServletException

class DefaultChatConfig {

    @Bean
    public ServletContextInitializer myInitializer() {
        return new ServletContextInitializer() {
            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {
                ServletContext.addListener(WebsocketHomeController)
            }
        }
    }

}

2 番目のファイル import path.to.WebsocketHomeController の上部にあるインポート行を整理する必要があります。

ところで、チャット プラグインに関する私のコメントの 1 つで、独自のインターフェイスを作成できることを提案しました。つまり、プラグインとやり取りするつもりでした。プラグインが多くの機能を実行しているが、自分のユーザーを管理したいとしましょう。

チャット クラスを呼び出して表示/編集/削除などを行う独自のアプリでサービスを作成するだけで済みます。ドキュメントのブートストラップを介してチャット ドメイン クラスに管理者アカウントを追加する方法を示したのとまったく同じ方法です。

これらのことのいくつかは、完全に理解するのに何年もかかりますが、怠惰になりたい場合は、これらのドメインクラスをチャットプラグインからテストプロジェクトにコピーし、grails を使用してそれらのコントローラーとビューを生成し、メインに戻ることができます新しいコントローラー/ビュー全体に投影およびコピーします。

プラグインが機能サービス/ドメイン クラス/コントローラーを提供する場合。それらはすべて、メイン アプリでローカルに再利用できます。単に拡張するか、それがよければ、他の人が使用できるようにプラグイン自体に戻すことができます

于 2015-11-17T09:06:01.047 に答える