欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

认识通信协议

程序员文章站 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也很必要。


下面将注意的第三点和第四点的程序奉上:
/**
 * 读取一条完整的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){}
	}

相关标签: xml xmpp 协议