首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >grails javax.websocket问题

grails javax.websocket问题
EN

Stack Overflow用户
提问于 2014-07-22 13:52:28
回答 1查看 872关注 0票数 1

Grails 2.3.7-Java 1.7

我看到了在核心java中使用的以下示例,并作为一个演示程序运行,试图在Grails中实现同样的功能,我知道websockets上有一些插件,但我试图自己解决这个问题:

控制器1

代码语言:javascript
运行
复制
package chat

class TestController {

    def index() { }
}

index.gsp

代码语言:javascript
运行
复制
<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="main">
        <g:set var="entityName" value="${message(code: 'admin.label', default: 'Admin')}" />
        <title><g:message code="default.create.label" args="[entityName,BAH,BAH]" /></title>
    </head>
    <body>  
    <form>
    <input id="textMessage" type="text">
    <input type="button" value="send" onClick="sendMessage();">
    </form>
    <br>
    <textarea id="messagesTextarea" rows="10" cols="50">
    </textarea>

    <script type="text/javascript">
        var webSocket=new WebSocket("ws://localhost:8080/chat/testing");
        var messagesTextarea=document.getElementById("messagesTextarea");
        var textMessage=document.getElementById("textMessage");
        webSocket.onopen=function(message) {processOpen(message);};
        webSocket.onmessage=function(message) {processMessage(message);};
        webSocket.onclose=function(message) {processClose(message);};
        webSocket.onerror=function(message) {processError(message);};
        function processOpen(message) {
            messagesTextarea.value +=" Server Connect.... "+"\n";
        }
        function processMessage(message) {
            messagesTextarea.value +=" Receive from Server ===> "+ message.data +"\n";
        }
        function sendMessage() {
            if (textMssage.value!="close") {
                webSocket.send(textMessage.value);
                messagesTextarea.value +=" Send to Server ===> "+ textMessage.value +"\n";
                textMessage.value="";
            }else {
                websocket.close();
            }   
        }
        function processClose(message) {
            webSocket.send("Client disconnected......");
            messagesTextarea.value +="Server Disconnected... "+"\n";
        }
        function processError(message) {
            messagesTextarea.value +=" Error.... \n";
        }
    </script>
    </body>
    </html>

主计长2:

代码语言:javascript
运行
复制
package chat

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.server.ServerEndpoint;

@ServerEndpoint("/testing")
class TestingController  {

    @OnOpen
    public void handleOpen() {
        System.out.println("Client is now connected.");
    }

    @OnMessage
    public String handleMessage(String message) {

        System.out.println("Client sent: " + message);
        String replyMessage = "echo "+message;
        System.out.println("Send to Client: " + replyMessage);
        return replyMessage;
    }

    @OnClose
    public void handeClose() {
        System.out.println("Client is now disconnected.");
    }

    @OnError
    public void handleError(Throwable t) {
        t.printStackTrace();
    }

}

就像我运行应用程序时一样

我在chrome中得到了以下错误:

代码语言:javascript
运行
复制
WebSocket connection to 'ws://localhost:8080/chat/testing' failed: Error during WebSocket handshake: Unexpected response code: 404 index:37
WebSocket is already in CLOSING or CLOSED state.  

在textArea中

代码语言:javascript
运行
复制
Error.... 
Server Disconnected... 

在ggts控制台上我看到:

代码语言:javascript
运行
复制
Client sent: null
Send to Client: echo null

最初,我试图通过这种方式来控制:

代码语言:javascript
运行
复制
package chat


class TestingController extends TestingEndpoint  {

}

在src/java/chat中

代码语言:javascript
运行
复制
package chat;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.server.ServerEndpoint;


@ServerEndpoint("/testing")
class TestingEndpoint  {

    @OnOpen
    public void handleOpen() { 
        System.out.println("Client is now connected.");
    }
    @OnMessage
    public String handleMessage(String message) {

        System.out.println("Client sent: " + message);
        String replyMessage = "echo "+message;
        System.out.println("Send to Client: " + replyMessage);
        return replyMessage;
    }
    @OnClose
    public void handeClose() { 
        System.out.println("Client is now disconnected.");
    }
    @OnError
    public void handleError(Throwable t) {
        t.printStackTrace();
    }

}

此方法产生的结果与ggts控制台中的任何结果相同。

想知道是否有人让javax.websocket在Grails工作。

EN

回答 1

Stack Overflow用户

发布于 2014-07-23 13:08:21

好的,让它起作用-还没那么糟

以下是解决办法:

  1. 普惠制中的几个排版:

index.gsp

代码语言:javascript
运行
复制
<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="main">
        <g:set var="entityName" value="${message(code: 'admin.label', default: 'Admin')}" />
        <title><g:message code="default.create.label" args="[entityName,BAH,BAH]" /></title>
    </head>
    <body>  
    <form>
    <input id="textMessage" type="text">
    <input type="button" value="send" onClick="sendMessage();">
    </form>
    <br>
    <textarea id="messagesTextarea" rows="10" cols="50">
    </textarea>

    <script type="text/javascript">
        var webSocket=new WebSocket("ws://localhost:8080/chat/annotated");
        var messagesTextarea=document.getElementById("messagesTextarea");
        webSocket.onopen=function(message) {processOpen(message);};
        webSocket.onmessage=function(message) {processMessage(message);};
        webSocket.onclose=function(message) {processClose(message);};
        webSocket.onerror=function(message) {processError(message);};
        function processOpen(message) {
            messagesTextarea.value +=" Server Connect.... "+"\n";
        }
        function processMessage(message) {
            messagesTextarea.value +=" Receive from Server ===> "+ message.data +"\n";
        }
        function sendMessage() {

            if (textMessage.value!="close") {
                webSocket.send(textMessage.value);
                messagesTextarea.value +=" Send to Server ===> "+ textMessage.value +"\n";
                textMessage.value="";
            }else {
                websocket.close();
            }   
        }
        function processClose(message) {
            webSocket.send("Client disconnected......");
            messagesTextarea.value +="Server Disconnected... "+"\n";
        }
        function processError(message) {
            messagesTextarea.value +=" Error.... \n";
        }
    </script>
    </body>
    </html>

现在,结束点的实际修复是从这里无意中发现的:https://tyrus.java.net/documentation/1.7/index/deployment.html示例3.2。使用ServerContainer部署附加说明的端点

因此,修正是添加一个src/java/MyServletContextListenerAnnotated.java

代码语言:javascript
运行
复制
package chat;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.websocket.DeploymentException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.server.ServerContainer;
import javax.websocket.server.ServerEndpoint;



@WebListener
@ServerEndpoint("/annotated")
public class MyServletContextListenerAnnotated implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        final ServerContainer serverContainer = (ServerContainer) servletContextEvent.getServletContext()
                                                    .getAttribute("javax.websocket.server.ServerContainer");

        try {
            serverContainer.addEndpoint(MyServletContextListenerAnnotated.class);
        } catch (DeploymentException e) {
            e.printStackTrace();
        }
    }

   /* @OnMessage
    public String onMessage(String message) {
        return message;
    }
*/
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }
    @OnOpen
    public void handleOpen() { 
        System.out.println("Client is now connected.");
    }
    @OnMessage
    public String handleMessage(String message) {

        System.out.println("Client sent: " + message);
        String replyMessage = "echo "+message;
        System.out.println("Send to Client: " + replyMessage);
        return replyMessage;
    }
    @OnClose
    public void handeClose() { 
        System.out.println("Client is now disconnected.");
    }
    @OnError
    public void handleError(Throwable t) {
        t.printStackTrace();
    }
}

由于gsp中的端点已经更新为使用新端点,所以最后一次接触是将_Events.groovy添加到脚本中:

代码语言:javascript
运行
复制
import groovy.xml.StreamingMarkupBuilder

eventWebXmlEnd = {String tmpfile ->
    def root = new XmlSlurper().parse(webXmlFile)
    root.appendNode {
       'listener' {
           'listener-class' (
               'chat.MyServletContextListenerAnnotated'
           )
        }
    }

    webXmlFile.text = new StreamingMarkupBuilder().bind {
        mkp.declareNamespace(
                "": "http://java.sun.com/xml/ns/javaee")
        mkp.yield(root)
    }
}

它是服务器连接的客户端发送blah。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24889317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档