过了一会儿,我得到了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!"
}
答案 0 :(得分:1)
这与Chanel API没什么关系 - 它只是回调服务器的标准xhr。您可以使用标准代码like this,也可以使用jquery like this等库。
如果需要将javascript解析为JSON,请使用JSON.stringify()。
在服务器上,您可以根据需要处理请求,通过标准HTTP将响应发送回客户端,或使用Chanel API不仅向原始客户端发送消息,还向所有连接的客户端发送消息。
答案 1 :(得分:0)
您熟悉Nick Johnson的频道API博客文章:
http://blog.notdot.net/2011/07/Using-the-Channel-API-on-App-Engine-for-instant-traffic-analysis
答案 2 :(得分:0)
App Engine的Channel API几乎仅用于从服务器&gt;客户端发送消息。这是一个单向渠道。
这很好,因为构建客户端&gt;服务器通道并不困难,但你必须自己构建它,它不是免费的。您必须为client-&gt;服务器消息定义自己的URL,然后使用XMLHttpRequest将消息发送到该URL。
有一个小例外,Channel API还有一个内置机制来通知服务器连接/断开连接。在封面下,这些是使用XMLHttpRequests到预定义的URL完成的(我认为它类似于_ah / channel / disconnect等等。这些对你没有用,因为它们被自动调用 - 你无法定义何时调用它们或内容。
所以是的,只需实现自己的URL处理程序,并将您的JSON数据发送到该URL。