-1

我正在尝试使用 javax.websocket 创建聊天。我正在使用 grails。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)
            }
        }
    }

}

您将需要整理第二个文件 import path.to.WebsocketHomeController 顶部的导入行

顺便说一句,在我对聊天插件的评论中,我建议您可以制作自己的界面。我的意思是与插件交互。如果插件为您做了很多功能,但假设您希望管理自己的用户。

您可以在自己的应用程序中编写服务,调用聊天类来查看/编辑/删除等。与我在文档中展示如何通过引导程序将管理员帐户添加到聊天域类的方式相同。

其中一些事情需要数年时间才能完全理解,但如果我想偷懒,我可以将这些域类从聊天插件复制到测试项目,然后使用 grails 获取它为它们生成控制器和视图,然后返回主跨新控制器/视图进行项目和复制。

如果插件提供功能服务/域类/控制器。它们都可以在您的主应用程序中本地重用。您可以扩展,或者如果它很好,那么只需将其贡献回插件本身供其他人使用

于 2015-11-17T09:06:01.047 回答