java 板


LINE

Blog 版:http://pt2club.blogspot.com/2011/09/channel-api.html 我不是故意要提 JavaScript 的 只是这玩意一定得搭配 JavaScript 啊...... Orz ======== Google App Engine 自 1.4.0 版推出 Channel API, 使 server 与 browser 之间可以不透过 pooling 的方式做到 server push。 不过 Google 官方教学文件掺杂了井字游戏的元素, 反而无法专注於 Channel API 上。 这篇文章打算用最原始的聊天室,透过实做的过程来体验一下 Java 版 Channel API。 因为是简易聊天室,所以只打算提供一个共用的聊天室, 然後用两个 JSP 档来解决:room.jsp、server.jsp。 room.jsp 负责处理使用者输入讯息、显示对话;server.jsp (应该写成 servlet 比较好,因为是简易聊天室......) 负责接收讯息、并广播出去。 对应到 Channel API 的用词,一个聊天室就是一个 channel, 同一个 channel 的成员(client 端)就会接收到其他成员所发出的讯息(message)。 所以,从 server 的角度,需要作这些事情: 1.开启一个 channel 2.给加入这个 channel 的 client 专属识别码(token) 3.接收讯息的管道 4.发送讯息的功能 在 Channel API 当中只要决定 channel 的 名字就算做到第一点了, 因为是简易聊天室,所以把名称订死为「PsMonkey」。 产生 token 的方法是: //Java code ChannelService channel = ChannelServiceFactory.getChannelService(); String token = channel.createChannel("PsMonkey"); 因为是简易聊天室,所以把 token 透过 JSP 产生、 并塞进 client 端的 JavaScript 码。 接下来看 client 端的部份。首先建立连线的部份: //JavaScript code var channel = new goog.appengine.Channel("<%=token%>"); //token 传入 var handler = { 'onopen' : onOpened, //建立连线、channel.open() 就会触发 'onmessage' : onMessage, //有讯息传入时 'onerror' : onError, //发生错误时 'onclose' : onClosed, //连线结束时 }; socket = channel.open(handler); socket 就是实际处理通讯的部份。 这段的重点是透过 handler 设订 socket 各种状况会触发的 method。 仔细想一下就会发现:「只有接收讯息的 method,那传送讯息呢?」 Channel API 要解决的问题是 server push, client 端传送讯息的功能并不包含在其中,得透过 HTTP request 来作到。 所以送讯息的 method 会长的像这样: //JavaScript code sendMessage = function(message) { var xhr = new XMLHttpRequest(); xhr.open('POST', 'server.jsp?msg='+message, true); xhr.send(); }; 於是用 sendMessage() 来设定在 client 端连线时送出「____ 进入聊天室」、 离线时送出「____ 离开聊天室」: //JavaScript code onOpened = function() { sendMessage("「"+name + "」进入聊天室......"); }; onClosed = function(){ sendMessage("「"+name + "」离开聊天室......"); } 有讯息进来的时候,就把讯息塞进某一个 element 的尾巴。 这边要注意一点,参数 msg 不是单纯的字串,而是一个物件, data 这个 field 才是真正回传的资料。 //JavaScript code onMessage = function(msg) { document.getElementById("output").innerHTML += msg.data +"<br />""; } 接着来看一下负责处理 client 端 sendMessage() 的 server.jsp,直接贴程式码: //Java code <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@page import="com.google.appengine.api.channel.*"%> <% String message = request.getParameter("msg"); ChannelService channel = ChannelServiceFactory.getChannelService(); channel.sendMessage( new ChannelMessage("PsMonkey", message) ); %> 在从 request 当中取得 clinet 端传上来的讯息後, 连同 channel 的名称包成一个 ChannelMessage, 透过 ChannelService.sendMessage() 传出去, 就会触发 client 端的 socket.onMessage 了。 再透过一些简单的 HTML 与 JavaScript 来让 client 端 送出讯息时能呼叫到 sendMessage(),聊天室就完成了! 是不是很简单呢? [扭扭] 最後补充 socket 的几件事情: onerror 会传入一个参数,其中有两个 field: description:错误的描述 code:HTTP 错误代码 目前只测出 idle 太久、server 切断连线时会触发 socket 还有一个 method:close(),呼叫成功会触发 socket.onclose。 完整可以跑的范例放在... (我懒得贴网址了 XD) -- 钱锺书: 说出来的话 http://www.psmonkey.org 比不上不说出来的话 Java 版 cookcomic 版 只影射着说不出来的话 and more...... --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.25.0.25







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP