认识通信协议

之前的通信基础已经让我们基本了解了是怎样实现通信这个过程的,但是知道这个过程远远是不够的,若要实现一个真正的好的聊天系统,必须具备一套比较好的通信协议,
什么是通信协议:

通信协议包括通信过程的交互流程和交互消息的格式

流程从简单来说:
我们进入聊天室必须要注册,要登录,然后才能聊天。所以:
A 客户机的第一步是发送注册或登录
B 服务器的第一步就是接收登录或注册的消息 然后返回一条成功或失败的消息
C 客户机必须接收到成功的消息才能进入下一步
就是这样一步步定义好的你发送,我接收我们商量好这个程序要怎么一步一步往下走。

而通信的交互消息的格式:
则是你规定什么样的消息表示是登陆,什么样的消息是注册,是聊天。简单来说就是你给每条消息的都要标记一下。而且这种标记是唯一的,通信双方共用的。
例如:在最简单的cmd模拟客户机的聊天中,我们就是用\r\n来结束一条消息,用bye来表示通信结束。

XMPP是以XM格式定义的C/S间传送的消息的协议,优点是便于扩展
XML全称是可扩展标记语言,是标准通用标记语言,也是通信中用的最多的。
例如:
<msg>msg</msg>将内容放在两个<>之间<>里面是位标记内容的字符,后面的字符前加一斜杠表示内容的结束。
我们在通信中是自定义的简单的XMPP来实现通信的。

在这个过程主要注意几点:
1.基本的流程图要先画出来,不要盲目开写,要画出主要的步骤,进而写出那几条XML语句备用。
2.你标记的标签自己要定义好,要有唯一性,有代表性,有通用性(即在服务器用Msg表示一条XML语句的时候,在所有的地方都得用这个来标记一条XML,以免混淆)。
3.要注意从一条XML消息中提取消息的格式,是提取<标记>内容</标记>里面的东西,那么所有的标签的提取方式都是一样,所有可以定义一个统一的提取模式。
4.任何字符串数字在底层都是以字节的形式发过去的,所以从客户机或服务器上读到的不是整条整条的XML语句,所以定义一个方法完整的一条条的读取XML也很必要。


下面将注意的第三点和第四点的程序奉上:

/**
* 读取一条完整的XML的消息
* @return:
* @throws IOException
*/
public String readString() throws IOException {
String msg = "";
int i = ins.read();// 读取一个字节
StringBuffer stb = new StringBuffer();
while (true) {
char c = (char) i;// 转化为字符
stb.append(c);
msg = stb.toString().trim();
if (msg.endsWith("</msg>")) {
break;
}
i = ins.read();// 继续读取
}
// 默认转为字符串是将每个字节转为一个字符串
// 在此处,转换时必须用GMK编码,将读到的消息编码为中文编码格式,否则会乱码
msg = new String(msg.getBytes("ISO-8859-1"), "GBK").trim();
return msg;
}




/**
* 发送一条聊天类型的XML消息
* @param sender:发送者
* @param reciver:接收者
* @param msg:内容
*/
public void senTextChat(String sender, String reciver, String msg) {
try{
String textChatXml="<msg><type>chat</type>"+"<sender>"+sender+"</sender><reciver>"+reciver+"</reciver><content>"+msg
+"</content></msg>";//拼接聊天消息XMl消息
System.out.println("发送的聊天内容"+textChatXml);
ous.write(textChatXml.getBytes());
}catch(Exception ef){}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值