过了一会儿,我让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。