网络通信基础第四式——实现自定义xmpp协议的KTM
从寒假正式开始通信项目的学习,距今已经快有两个月了。寒假期间,回到家,因为种种原因(多数是因为贪玩),大概一个多月没接触通信项目的开发,很是愧疚啊!寒假结束,一开学,院里就组织大家做课程设计,我为了尽早重回通信项目的开发,连夜赶工将课程设计的订票系统做完,第一个将源代码交给老师。随后,我立马开始了通信项目的后续开发。
对于将近一个多月没看的代码,虽然是自己辛辛苦苦敲出来的,但是一眼看去竟是那样的陌生,我发誓下次开发项目再也不拖沓了。我花了整整一天时间,回顾之前所写的代码,并结合胡哥的教诲,慢慢重新回到昔日项目开发的专注状态。寒假期间的集训,我基本完成了服务器的相关构建,包括创建循环等待的多线程服务器,实现服务器的启停,通过命令行输入telnet指令完成客户机与服务器的连接。
在最近一个星期,我通过自学文档以及与胡哥的交流,将该通信项目的基本功能逐一实现,并将此程序取名为KTM(king talk message),和一个著名车队同名,哈哈!
下面我就讲讲这一阶段的初步成果吧。首先,我完善了服务器端的界面,实现了服务器端对于客户机的简单管理和发送消息。其次,编写了简单的登录和聊天界面。最后,实现了自定义xmpp协议,使服务器和客户机的交互更加规范,流程更加清晰,相比之前的完全自定义协议要好理解的多。
一、消息类型:
1、登录请求消息
<msg>
<type>login</type>
<name>用户名</name>
<pwd>密码</pwd>
</msg>
<msg><type>login</type><name>user1</name><pwd>pwd1</pwd></msg>
<msg><type>login</type><name>user2</name><pwd>pwd2</pwd></msg>
<msg><type>login</type><name>user3</name><pwd>pwd3</pwd></msg>
2、登录应答消息
<msg>
<type>loginResp</type>
<result>登录返回结果</result>
<!--0:登录成功,1:用户名和密码不符,登录失败-->
</msg>
3、上线消息:
<msg>
<type>onLine</type>
<userName>上线者的用户名</userName>
<!--上线者用户名-->
</msg>
<msg><type>onLine</type><userName>上线者的用户名</userName></msg>
4、在线用户表消息:
<msg>
<type>userList</type>
<users>用户1,用户2,...</users>
<!--在线的所有用户名,以“,”隔开-->
</msg>
<msg><type>userList</type><users>用户1,用户2,...</users></msg>
5、聊天消息:
<msg>
<type>chat</type>
<sender>发送者用户名</sender>
<!--发送者用户名-->
<receiver>接受者用户名</receiver>
<!--接受者用户名,如果为空,表示对所有用户发送消息-->
<content>文本消息内容</content>
<!--发送的消息内容-->
</msg>
<msg><type>chat</type><sender>发送者用户名</sender><receiver>接受者用户名</receiver><content>文本消息内容</content></msg>
6、服务器踢人消息:
<msg>
<type>kickOff</type>
<userName>服务器踢掉用户的用户名</userName>
<!--服务器踢掉用户的用户名-->
</msg>
<msg><type>kickOff</type><userName>服务器踢掉用户的用户名</userName></msg>
7、下线消息:
<msg>
<type>logOff</type>
<userName>下线者的用户名</userName>
<!--下线者用户名-->
</msg>
<msg><type>logOff</type><userName>下线者的用户名</userName></msg>
二、交互流程:
1、客户机与服务器建立TCP/IP连接后,发送的第一条消息,只能是登录请求消息。
2、服务器向客户机发送登录应答消息,若某客户机登录成功后,服务器对在之前所有的在线用户发送有人上线的消息, 并向该客户机发送在线用户列表消息。若无客户机登录成功,则断开客户机与服务器建立的TCP/IP连接。
3、服务器接收到客户机发送到聊天消息后,将这条消息发送给指定的客户机用户,服务器也可以自己向客户机发送聊天信息。
4、服务器可以在客户机登陆之后的任意时刻将该客户机踢掉,当服务器将该客户机踢掉后,
服务器对所有剩下的客户机发送该客户机下线的消息。
5、某个客户机主动下线后,服务器对所有剩下的客户机发送该客户机下线的消息。
三、相关界面:
图1-1 服务器管理界面
图1-2 客户登录界面
图1-3 客户聊天界面 1 楼 hnujerrymouse 2011-03-17 越来越厉害了,我要向你看齐才行了啊,哈哈 2 楼 toeo 2011-04-13 知道 google的 gtalk的 实现就是基于 xmpp 这个标准的。
没有想到还有人研究。
我在 google wave 里面的代码 里面看到 基于 xmpp的通讯。没有具体看。
http://code.google.com/appengine/docs/java/xmpp/overview.html
google app 上面就提供了这个通讯接口。不过要在 google的 app 上面才可以运行。
http://code.google.com/appengine/articles/using_xmpp.html
没有太深入研究。。继续关注。