Java WebSocket 开发 Webbit

webbit是基于netty扩展的websocket工具。可以大大简化websocket开发。

项目地址:https://github.com/webbit/webbit

使用说明:https://github.com/webbit/webbit/blob/master/README.md

本文权当翻译,高手直接进上面链接

一些题外话:

  1. websocket和我一开始想象的TCP应用不同。websocket和传统意义上的socket通信不一样。本质上还是HTTP的扩展。
  2. websocket协议目前还没有定稿。目前主要有3个版本的协议在使用。且都是草案。webbit都实现了3个草案。具体参阅维基http://en.wikipedia.org/wiki/WebSocket

快速开始

Maven配置

 配置端口8080.并配置websocket路径/socket的handler

 编写/socket handler

到此为止。基本代码已经都好了。感觉更写个servlet一样方便。

下面是客户端代码:

到此为止。websocket基本功能都已经实现。

 

 

netty+flash xmlsocket 在线聊天室

这几天公司做了个简单的web im聊天室。麦包包晒包频道 右下角的“包打听”。

采用netty 做socket server + flash client. 通讯采用自定义的JSON文本。

在线IM初步的探索,现阶段做的比较简单。

目前就部署1台服务器。没有考虑多机通信。没有涉及通信队列。

总共代码不到1000行。netty的确强大。

关键代码分享:

无话可说的代码,netty通用设置。

由于采用JSON协议。

上行通道:

  1. DelimiterBasedFrameDecoder 读取缓存时,已\0\r\n 为中止符
  2. StringDecoder 二进制转字符串进行UTF-8解码
  3. StringEncoder 字符串UTF-8编码

下行通道:

  1. MessageHandler 业务逻辑处理
  2. MessageEncoder JSON转字节流打入下行通道

netty没有提供\0截取。不过重写部分代码即可。

逻辑处理:

  1. 处理flash 的policy file request
  2. 处理业务逻辑

 

具体业务在    MessageDispatchHandler 处理一些业务逻辑即可。

总结下遇到的问题:

  1. flash socket通讯格式。每个协议请求都会\0作为消息结尾。因此netty接收消息也必须以\0为截止符读取消息。
  2. flash 安全策略。flash夸域访问服务器时,会自动发<policy-file-request/> ,服务端收到消息后,必须响应对应策略文件。
  3. SQL注入。Socket和Http相比。只是通讯的层次发生了改变。应用本身的漏洞仍旧没变。处理SQL的时候需要特别注意。不过用一些成熟的ORM框架可以很好的避免这类问题。
    注:这里使用的是比较低级的JSON字符串作为消息载体,较为普遍和靠谱的做法是采用head+body的方式,但前提需要对格式有严格的约定。JSON灵活性较大,因此采用。

python模拟飞信(模拟webim)

之前写过一点飞信相关的小程序。很久没关心了。发现现在飞信协议都改掉了。强制了验证码。基本上原来的第三方库都不能使用了。

下面就是现在的飞信验证码。看上去破解难度不大。就一根干扰线。有哪位可以破解的网友贡献下代码to me<me[???]fengsage.com> 替换[???]你懂得。
飞信验证码

废话不多说,开始进入正文。

最近发现飞信官网出了webim版的飞信。而且因为年底工作不多。有点无聊。花了几周无聊时间写写代码。给自己发发短信神马的。没多大意义。

项目地址:http://code.google.com/p/fetionim/

值得注意的地方:

  1. 这个程序不是api库。如果验证码能破解则可以作为API库。
  2. 这个程序需要不关机环境。因为要保持和飞信server的心跳连接。一旦关机需要重新登录。
  3. 很多未知bug

目前实现的功能:

  1. 简单的cron表达式。目前只支持 month day hour minute 四个区间. 支持一个*通配符。一般用用够了。举例:[* * * *]表示每分钟执行到。[* * 20 00]表示每天20点执行。[* 20 * *] 表示每月20日的每一分钟执行到。[12 20 20 1]表示12月20日20点1分执行到。
  2. 只支持2种定时任务。即天气预报(只支持嘉兴.因为我住这)和任意短信。

未来要实现的功能:

  1. 天气预报各地支持。这块实现起来很简单。但打算重新设计下任务模块和cron模块。到时候一起改。
  2. 开放一些api。方便其他程序连接。比如宏机短信……
  3. 做个wordpress插件。方便博友直接通过短信联系作者。

 一些废话:

本来不打算发布这个。个人感觉这玩意不能算是什么好的作品。不过以我个性,如果不发布这玩意。估计后面也懒得去维护了。索性发布。代码写的不好。看到的朋友请口水少喷。多提点实在点的意见。

java和ruby都有基于webim的类似实现。

java参见:litefetion
ruby参见:fetion-robot

python的应该算是独一无二的。我没看过这些现有的代码是如何实现的。纯粹自己编写边想。思路和方式和他们应该都存在较多的不同。算是给python初学者提供一些例子吧。

 

总结2011

每年都给自己写个总结。写给将来的自己看。

不太会写文章,分几个方面总结下2011过去的一年。

生活

离开了生活了5年多的杭州。其实说是5年。但里面有3年大学生活,只有2年的工作。虽然是爸妈的意思,但我知道,其实是我自己的软弱。我害怕孤单的一直生活下去。每天上班下班。不知道前面的路在哪里。回嘉兴的这一年来感觉非常的放松,再也没有了那种漂泊孤单感觉,有着家人的关爱,重新滋润了我那干枯的心床。我不后悔!感谢小龚老师、小王老师、老蒋童鞋。曾经的照顾和关怀~

工作

告别了曾经共同奋斗过得同事们,告别了我最尊敬的王总。感谢你2年前给我一个走出大学的学生机会,让我不至于在茫茫的毕业潮中失去方向。在公司的这段日子是我毕生难忘的日子。你教会了我如何学习,如何沟通,如何写文档……感谢震宇,我的好兄弟,好朋友。感谢所有曾经给我过帮助的同事朋友们。
这1年找了2份工作,这在我以前看来是十分反常的。我很反感经常换工作的人,频繁的换工作即是对公司的不负责任也是对自己的懈怠。然而我犯了这个错误。
回嘉兴的第一份工作是在浙江衣派网络科技公司,一家不上进的公司。从刚开始给人一种勃勃生机的兴奋,到最后给人一种日落黄昏的伤感。不想过于主观的评价一家公司,这里感谢强哥,老陆,小朱,老吴,小彭。感谢技术部同事们给我的帮助和照顾。感谢你们包容我的缺点,祝愿新的一年,你们在各自的岗位上取得新的成就。
第二家公司就是现在的嘉兴麦包包网络科技公司。说实话我刚回嘉兴之前从来没听说过。虽然麦包包在电商领域已经较有名气。来麦包包的理由就简单,一是上一家公司的确经营不善,面临裁员的风险,其次就是这里有我非常感兴趣的项目,搭建自己的支付系统。前面这半年,基本快打磨掉我的积极性,整天准点下班,做些没有挑战的事情。人都懒散了。然而这个项目给了我兴奋的感觉。我太渴望有所提升。感谢我的胖师傅银鲨,二师弟银鲈.(呵呵,麦包包的企业文化的确做得不错,有意思的花名文化,虽然山寨但不错)。你们给了我太多太多的帮助。银鲨师傅的“苛刻”灭了偷懒的借口,重新点燃了我的斗志。银鲈童鞋的固执,坚持,避免了我很多bug的出现。然而好事多磨,年前的1个月,银鲨师傅的突然离职,让我感到希望的破灭,没有领路人的感觉真的不好受。随后项目的暂停和转移,让我有了离开麦包包的想法。12月被安排到日本项目组,我有种被打入冷宫的感觉。为了总监给我的希望,坚持了1个月。回头想来这1个月同样精彩。跟新的同事打了交道,虽然已经来了2个多月,但是除了跟银鲨和银鲈,没有和太多的同事沟通,想来有点可悲。感谢滕枣童鞋,很高兴与你的合作。这个月是轻松愉快的。感谢下糯米同学,你是我见过最有才华和实力的应届毕业生了。希望你在新一年里,新的公司取得更多的成就。年初之际总监重启了支付项目,今年这个将是我努力的目标和方向。
感谢下卷丹童鞋、木虱童鞋、戎麦童鞋、巴叶童鞋、灵猫童鞋、角蒿童鞋、银鲈童鞋、章木童鞋、腾枣童鞋、铁阕童鞋、青柠童鞋、戟天童鞋、白鱼童鞋、翠雀童鞋、戎草童鞋、海椒童鞋、蜂虎童鞋、蝎虎童鞋、龙猫童鞋、简草童鞋、洋姜童鞋、白鲩童鞋、蓝天童鞋、白苏童鞋、西柚童鞋、毛尖童鞋…..(排名按我座位的远近,方便我回想。并且在职的同事。保佑我都记全了)

感情

感情方面一直是我的弱项,25年来就没真正谈过一场恋爱。大学里我不想谈,更不敢谈。承担不起责任的我,没资格谈恋爱。所以我不后悔。这方面今年是可悲一年。一是曾经很喜欢的女生结婚了,我从头到尾都没有勇气去追求过,伤悔。二是好不容易相亲到一个比较中意的女生,准备踏踏实实一起走下去。但对方一句从来没有喜欢过我,把我打落了谷底。我不怪她,如果我能多关心关心她,也许结局会不一样。感情方面一直都是我很回避的方面,但2012年我会改正这一点。遇到喜欢的就尽力去追,”放开”的去追。不想以后来了有后悔。

财产

左边是全年的支出图,总体感觉每一笔钱都是有价值的。
理财方面非常的糟糕。今年基本亏损10%左右。还在坚持定存的习惯,投入财产的资金不多。总体亏损在1-2K之前。但和我2011年初制定的理财计划已经相差太多了。2011理财计划。感觉今年的亏损主要原因还是投机心太重,没有真正的肯去学习理财知识。以为读几本理财方面的书,就能理到财。其次今年全球的经济的确不景气。黄金大大起大落,给人当年中国股市崩盘的感觉。

 

2012的展望

工作上,把东西做好,做漂亮。努力工作,早日升值加薪。
生活上,多做点力所能及的事情,少让爸妈操心。周末多学点菜,为将来做准备。
感情上,希望今年能找到心仪的女朋友,早日踏上婚姻的”坟墓”。
理财上,有空,踏踏实实学点经济常识,少点投机心,多点主观意念。
学习上,今年要好好学好英语。踏踏实实。把阅读和听力提升一个台阶。
身体上,有时间好好锻炼下自己,瘦巴巴的,像柴火一样。我是女人也不会喜欢。

2012欢迎我吧~

wordpress图片搬家脚本

历经几次换域名,以及从GAE-wordpress造成不少历史遗留的图片分布在不同域名或gae目录下。

主要分布
http://oldres.fengsage.com
http://www.fengsage.com
http://fensageblog.appspot.com

原来使用代码实现图片代理访问。但自己越看越不爽。索性写个脚本一次性把原来的图片下载到wordpress本地。并且更新数据库。主要是圣诞节闲的蛋疼。

代码有不少问题:

  1. 不用php,因为懒得看wordpress插件制作。
  2. 因为是python脚本,所以必须是有执行python的权限
  3. 没有生成wordpress media记录。不能后台编辑多媒体

wordpress插件实现:

http://wordpress.org/extend/plugins/velvet-blues-update-urls/  等发现的时候脚本已经写好了。悲哀~~

脚本笔记简单。分享下。

javascript实用模板引擎

John Resig 开发的一个简易模板引擎,配合json非常的实用。

很少的一点代码。但功能非常实用。

准备json和一个模板即可

jquery simple template demo

zookeeper资料汇集

这几天看了下zookeeper的东西。收获多多。感谢国人的分享精神。使得这一产品能被更多人了解。

zookeeper基础配置与入门:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/

agapple学习笔记系列:http://agapple.iteye.com/blog/1292473

taobao通用产品团队:http://rdc.taobao.com/team/jm/archives/448

Paxos算法:http://zh.wikipedia.org/zh/Paxos%E7%AE%97%E6%B3%95

工具:https://github.com/killme2008/node-zk-browser 淘宝团队开发的一个zookeeper节点管理工具。nodejs开发。功能简单。基本实现了zookeeper命令行的功能。

文档是最佳的知识沉淀呀~

apache zookeeper

zookeeper

 

 

jmock2学习笔记-续

总结下这几天初步学习mock的心得. 文中大部分内容来自官网文档.

创建Mock对象

创建Mock Expections

expections 这里指的是jmock在不同情况下的预期值。expections 是jmcok的最重要部分之一。可以模拟用户在不同情况下返回不同的结果。

<expections block>这里是可以设置多个expections 。

Expectations

expections的结构如下:

上面是一个通用的结构。所有expecions都采用相同或更简洁的结构。

invocation-count mock调用频率。oneOf表示调用一次后这个expections即失效。
mock-object mock对象。即上面Mockery创建的对象。
method 用mock代替实现接口的一个方法。所以mock必须使用接口编程。
argument-constraints mock参数条件。即mock指定方法的参数。
when … will…then … 类似于if .. else… 这样的语句。简单的条件表达式
action mock符合条件后,执行操作。一般是返回结果。或者抛出异常
state-machine 条件表达式。

下面详细讲解下expectations各个部分。

Invocation Count

oneOf 只执行一次
exactly(n).of 执行指定n次
atLeast(n).of 至少执行n次
atMost(n).of 最多执行n次
between(min,max).of 可以执行min-max次
allowing 允许执行,不受限制
ignoring 功能同allowing类似。这里主要字面上区分allowing
never 不允许执行

Actions

will(returnValue(v)) 返回一个值。Object类型任意。集合类型不建议这里返回。虽然也可以
will(returnIterator(c)) 返回一个集合类型的值。
will(returnIterator(v1, v2, …, vn)) 返回一个集合类型的值。可以用多个,来分隔。
will(throwException(e)) 抛出一个异常。
will(doAll(a1, a2, …, an)) 嵌套执行多个actoin。不常用。

Sequences

设定mock方法调用的顺序。简单的看下面代码片段。
定义了先save后countUser。调用的时候也必须找这个顺序。否则用例失败。

jmock2学习笔记

目前晚上学习jmock。

Issue: spring+annotations使用jmock

遇到了这个场景。stackoverflow上有人问过这个问题,这里贴一下。

http://stackoverflow.com/questions/1638911/mock-object-and-spring-annotations

关键是使用ReflectionTestUtils的方法。这个方法在spring-test工程的相关jar包。

Issue:入参对象时。mock表达式传入对象必须和实际传入对象为同一句柄。

共用一个_user句柄。否则报错。

Issues:jmock一个异常错误

推荐链接:http://superleo.iteye.com/blog/143493

相关:jmock2学习笔记-续

第 1 页,共 13 页12345...10...最旧 »