之前的服务器与客户端的通信过程中,双方都是直接发送信息内容,并默认以回车符结尾,这样的通信方式(也可以算作一种协议)所包含的信息过于简单与贫乏。没有包含信息的类型(登录、验证、私聊等)的信息,也不能包含发信人,收信人的信息,这只能在简单群聊服务器中使用。如果在比如QQ等这些较为复杂的聊天环境下就显得信息难以处理。
所以我们要通过制定一定的协议来扩充通信中信息所包含的信息量的大小。这里使用的是xml协议来定义通信信息的格式。Xml格式有点类似于html,但与html的区别在于xml的标记元是可以自定义的,而html的标记元则受限于解析工具的设置范围。这也取决于两种格式的主要作用。Xml侧重于体现信息所体现的意义即信息的本身,而html则重于表示信息的格式即信息的表现方式。
基于流程可以先把消息形式粗略分为9种:登录消息,登录应答消息,注册消息,注册应答消息,上线、下线消息,聊天消息,用户列表消息,还有由服务器自己发送给客户机的消息。
自定义的协议如下
1、登录消息:客户机登录时发送用户名密码给服务器
<m>
<type>login</type>
<name>name</name>
<pwd>pwd</pwd>
</m>
2、登录应答消息:服务器返回客户的登录请求是否成功
<m>
<type>loginRsp</type>
<state>登录结果</state><!--0:成功,其他:失败-->
</m>
3、注册消息:客户机发送注册请求给服务器
<m>
<type>reg</type>
<name>name</name>
<pwd>pwd</pwd>
</m>
4、注册应答消息:服务器返回客户的注册请求是否成功
<m>
<type>regRsp</type>
<state>注册结果</state><!--0:成功,其他:失败-->
</m>
5、聊天消息:
<m>
<type>chat</type>
<sender>senderName</sender>
<reciever>recieverName</reciever>
<msg>msg</msg>
</m>
6、上线消息:
<m>
<type>onLine</type>
<user>name</user><!--上线者名字-->
</m>
7、下线信息:
<m>
<type>offLine</type>
<user>name</user><!--下线者名字-->
</m>
8、用户列表信息:
<m>
<type>budyList</type>
<users>all,user1,user2,...</users>
</m>
9、服务器给客户机消息:
<m>
<type>serverMsg</type>
<user>name</user>
<msg>msg</msg>
</m>
协议制定好之后就是对协议的解析。Xml的很简单,xml中标记元的作用就是确定信息的位置及其信息类型,并对其进行相应的处理。由于所有可能出现的标记元都是已知的(如果完全按照自己制定的协议的话),那么只要使用String.indexOf()和String.subString()等方法来查找和截取信息即可。