从 JavaScript 客户端到服务器的 Google 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警报,我相信连接正在工作。现在,如果有人单击该按钮,我想向服务器发送消息。

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

像这样:

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

这与Chanel API没有太大关系 - 它只是对服务器的标准xhr回调。你可以像这样使用标准代码,也可以像这样使用像jquery这样的库。

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

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

你熟悉尼克·约翰逊的频道 API 博客文章吗:

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

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

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

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

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

最新更新