0

过了一会儿,我得到了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警报,我相信连接正常。现在,如果有人单击该按钮,我想向服务器发送一条消息。

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

就像是:

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

3 回答 3

1

这与 Chanel API 并没有太大关系——它只是一个标准的 xhr 回调到服务器。您可以像这样使用标准代码,或者像这样使用像 jquery这样的库。

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

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

于 2012-09-28T14:05:45.317 回答
0

您是否熟悉 Nick Johnson 的频道 API 博客文章:

http://blog.notdot.net/2011/07/Using-the-Channel-API-on-App-Engine-for-instant-traffic-analysis

于 2012-09-28T13:55:28.993 回答
0

App Engine 的 Channel API 几乎只用于从服务器->客户端发送消息。这是一个单向通道。

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

有一个小例外,Channel API 也有一个内置机制来通知服务器连接/断开连接。在幕后,这些是使用 XMLHttpRequests 到预定义的 url 完成的(我认为它类似于 _ah/channel/disconnect 之类的东西。这些对您没有用处,因为它们会被自动调用 - 您无法定义它们何时被调用,或内容。

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

于 2012-09-28T14:55:12.473 回答