认识通信协议
程序员文章站
2022-06-26 18:13:35
...
之前的通信基础已经让我们基本了解了是怎样实现通信这个过程的,但是知道这个过程远远是不够的,若要实现一个真正的好的聊天系统,必须具备一套比较好的通信协议,
什么是通信协议:
通信协议包括通信过程的交互流程和交互消息的格式
流程从简单来说:
我们进入聊天室必须要注册,要登录,然后才能聊天。所以:
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也很必要。
下面将注意的第三点和第四点的程序奉上:
什么是通信协议:
通信协议包括通信过程的交互流程和交互消息的格式
流程从简单来说:
我们进入聊天室必须要注册,要登录,然后才能聊天。所以:
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){} }
上一篇: HTTP协议小记
下一篇: XMPP协议中的隐私策略