从JavaScript客户端到服务器的Google Channel API消息

时间:2012-09-28 13:38:22

标签: java google-app-engine channel-api

过了一会儿,我得到了Google Channel API工作的第一部分。现在我在从JavaScript客户端向服务器发送消息时遇到了一些问题。 这是Google Channel API连接的servlet:

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    UserService userService = UserServiceFactory.getUserService();
    User user = userService.getCurrentUser();
    if (user != null) {
        ChannelService channelService = ChannelServiceFactory.getChannelService();
        String token = channelService.createChannel(user.getUserId());

        FileReader reader = new FileReader("index.html");
        CharBuffer buffer = CharBuffer.allocate(16384);
        reader.read(buffer);
        reader.close();

        String index = new String(buffer.array());
        index = index.replaceAll("\\{\\{ token \\}\\}", token);

        resp.setContentType("text/html");
        resp.getWriter().write(index);
    } else {
        resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
    }

index.html如下所示:

<script src="/_ah/channel/jsapi"></script>

<body>
    <script type="text/javascript">
        onOpened = function() {
            alert("opened");
        }

        var token = "{{ token }}";
        var channel = new goog.appengine.Channel(token);
        var handler = {
            'onopen' : onOpened,
            'onmessage' : onMessage,
            'onerror' : function() {
            },
            'onclose' : function() {
            }
        };
        var socket = channel.open(handler);
        socket.onopen = onOpened;
        socket.onmessage = onMessage;

        function sendMessage() {
            // Send JSON object to server   
        }
    </script>
    <h1>Google Test Channel API</h1>
    <form>
        <input type="button" value="Send" onclick="sendMessage();">
    </form>
</body>

如果我加载应用程序,我收到opened警报,我相信连接正常。现在,如果有人点击按钮,我想向服务器发送消息。

我读到我必须使用带有POST或GET的XMLHttpRequest函数。但我不会传递新的网址,我 只会传递一个值。有没有办法将JSON对象发送到服务器?

类似的东西:

{
    "message": "This is a JavaClient message!"
}

3 个答案:

答案 0 :(得分:1)

这与Chanel API没什么关系 - 它只是回调服务器的标准xhr。您可以使用标准代码like this,也可以使用jquery like this等库。

如果需要将javascript解析为JSON,请使用JSON.stringify()。

在服务器上,您可以根据需要处理请求,通过标准HTTP将响应发送回客户端,或使用Chanel API不仅向原始客户端发送消息,还向所有连接的客户端发送消息。

答案 1 :(得分:0)

答案 2 :(得分:0)

App Engine的Channel API几乎仅用于从服务器&gt;客户端发送消息。这是一个单向渠道。

这很好,因为构建客户端&gt;服务器通道并不困难,但你必须自己构建它,它不是免费的。您必须为client-&gt;服务器消息定义自己的URL,然后使用XMLHttpRequest将消息发送到该URL。

有一个小例外,Channel API还有一个内置机制来通知服务器连接/断开连接。在封面下,这些是使用XMLHttpRequests到预定义的URL完成的(我认为它类似于_ah / channel / disconnect等等。这些对你没有用,因为它们被自动调用 - 你无法定义何时调用它们或内容。

所以是的,只需实现自己的URL处理程序,并将您的JSON数据发送到该URL。