您的位置:首页 > 移动开发 > Android开发

利用飞鸽协议实现通信功能

2016-04-11 14:24 309 查看
一、飞鸽协议的格式:版本号:包编号:发送者名字:发送者主机名:命令字:附加信息

二、IPMSG的主要功能:局域网通信、传输文件、传输文件夹、通过添加局域网外IP来实现网外的聊天与文件传输功能。

主要优点:可以运行与两个不同平台的程序之间通信;

不需要服务器进行转发;

属于应用层协议,描述了飞鸽程序通信时的语法和语义;

三、飞鸽协议的用法:按飞鸽协议的格式封装DatagramPacket(数据包),再通过DatagramSocket发送给对方,接收端同样按飞鸽协议的格式解析数据包,进行数据操作,实现通信。

四、IPMSG上线流程:

首先发送IPMSG_NOOPERATION,默认是不做任何处理,然后上线通告报文IPMSG_BR_ENTRY。每次IPMSG在收到上线报文后,都要查找相同IP的节点是否已经存在,只要和Java Bean对象中hostIP比较就可以了,这样整个用户列表当中的成员是不会重复的。

发送上线报文1:XXX:用户名:主机名:IPMSG_BR_ENTRY:用户名 + “\0” + 组名

五、IPMSG离线流程:

发送离线报文1:XXX:用户名:主机名:IPMSG_BR_EXIT:

六、IPMSG聊天功能的流程:

默认使用2425端口做数据传输(TCP/UDP)

IPMSG通过UDP协议实现聊天,当一个IPMSG客户端运行开始,首先它向整个局域网广播上线报文,局域网内的其他IPMSG客户端收到上线报文后,回复该报文,回复报文中包含了该客户端的IP、PORT、用户名、机器名,其中IP地址在UDP协议的通信包里自动添加,其他信息需要根据飞鸽协议手动添加到DatagramPacket。这样在上线客户端通过广播发送上线报文后,局域网内的其他所有IPMSG客户端都发送一个回复报文,这样,所有IPMSG的客户端都更新自己的在线用户列表。这样IPMSG的上线就算结束了。

七、发送消息的流程:

客户端发送消息通过UDP来完成,客户端通过查询自己的用户列表获取其他用户的网络地址信息,发送消息给其他用户。使用IPMSG_SENDMSG命令发送消息,消息内容添加在附加信息中;在接收消息时,如果对方要求回信确认(IPMSG_SENDCHECKOPT位打开),则需要发送IPMSG_RECVMSG命令,并将对方发送的数据包的编号放在附加信息中一同发送至发送消息方。[注:我就发现在这里发现包编号的用图]

由于UDP的不可靠性,所以就要要求接收方回复回执信息。

1:XXX:用户名:主机名:IPMSG_SEND_MSG|IPMSG_SENDCHECKOPT选项,就要立即回复如下信息1:XXX:用户名:主机名:IPMSG_RECVMSG:接收到的包编号

八、对命令字的解析:

报文中的命令字是一个32位无符号整数,包含命令(最低字节)和选项(高三字节)两部分。所以在接收到报文后就要解析命令字段的低八位,过滤方法:命令字段 & 0XFF = 飞鸽协议定义的命令

(1)带有BR标识的为广播命令

IPMSG_NOOPERATION 不进行任何操作

IPMSG_BR_ENTRY 用户上线

IPMSG_BR_EXIT 用户退出

IPMSG_ANSENTRY 通报在线

IPMSG_SENDMSG 发送消息

IPMSG_RECVMSG 通报收到消息

IPMSG_GETFILEDATA 请求通过TCP传输文件

IPMSG_RELEASEFILES 停止接收文件

IPMSG_GETDIRFILES 请求传输文件夹

九、处理附加字段多余的分隔符“:”

把接收到的DatagramPacket中取出date字段,将数据使用split(“:”)进行切割,放入String[]中,把String[5]开始的数据拼接起来,组成附加字段的全部信息。

十、文件传输

带有IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG命令可用来传输文件,文件属性及内容添加在附加信息中,文件内容添加在消息内容后并以“\0”分隔开。

通过UDP报文联络,在UDP报文联络好之后,随即发起TCP文件传输,文件传输是不带格式的。

具体步骤:

1、发送端发送一个UDP数据包,通知接收端准备接收文件,通知在一个socket上监听TCP连接事件;

2、接收端回发一个UDP数据包,告诉发送端已准备好接收数据,并请求一个TCP的连接;

3、发送端接收连接的请求,并将文件映射到内存中,然后创建发送文件线程,开始进行数据的发送;

4、接收端创建接收的文件,然后创建接收数据的线程,开始收取数据,接收完以后,将数据写入到创建好的文件中。

我已按飞鸽协议的规则集成了一个代码库,可以直接集成到你的工程中,快速利用飞鸽传书实现通信功能。已开源【由于时间较短,难免有Bug,还望指正】

代码库和使用Demo下载传送门https://yunpan.cn/cqt8EVUM3hJJM 访问密码 2a2b

参考网站:

飞鸽传书协议官网:http://ipmsg.org/index.html.en

飞鸽传书协议(翻译稿)http://www.cnblogs.com/hnrainll/archive/2011/05/07/2039567.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息