概述
飞鸽传书是早些年常用的局域网通信工具,可以收发文字消息,也可以传输文件,本文通过python的udp编程,与飞鸽传书进行通信,了解通信协议
飞鸽传书的主要功能
- 上线、下线通知
- 收发文字消息
- 文件传输
飞鸽传书的通信协议
为了实现上述功能,要制定一个通信协议:
版本号:包编号:发送者姓名:发送者主机名:命令字:附加信息
- 版本号:协议版本号,目前为1
- 包编号:必须是不重复的数字
- 命令字:指明这个报文的类型,
如:- 用户上线:1
- 发送消息:32
- 附加信息:在不同的命令字下是不一样的,如果命令字是消息,那么附加信息就是消息内容
更多协议参见:
https://blog.csdn.net/whatnamecaniuse/article/details/48546343
代码实现
通知上线
广播方式实现
#coding=utf-8
import socket,getpass,time
# 获取当前用户名
user_name = getpass.getuser()
# 获取当前主机名
hostname = socket.gethostname()
port=2425
address=('192.168.0.201',port)
udp=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 广播通知上线
udp.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# msg='1:12342138:测试用户:测试-pc:1'
# 不要给自己发上线通知,用户名、主机名与飞鸽传书中的自己相同,无法区分,除非给自己改名
msg='1:%d:%s:%s:1'%(int(time.time()),user_name,hostname)
udp.sendto(msg.encode('GBK'),('255.255.255.255',port))
发送消息
#coding=utf-8
import socket,getpass,time
# 获取当前用户名
user_name = getpass.getuser()
# 获取当前主机名
hostname = socket.gethostname()
port=2425
address=('192.168.0.201',port)
# msg='1:12342138:测试用户:测试-pc:32:哈哈'
# 如果给自己发消息,用户名、主机名与飞鸽传书中的自己相同,无法区分,除非给自己改名
msg='1:%d:%s:%s:32:哈哈'%(int(time.time()),user_name,hostname)
udp=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp.sendto(msg.encode('gbk'),address)
完整代码
#coding=utf-8
import socket,getpass,time
# 获取当前用户名
user_name = getpass.getuser()
# 获取当前主机名
hostname = socket.gethostname()
port=2425
address=('192.168.0.201',port)
udp=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 广播通知上线
udp.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# msg='1:12342138:测试用户:测试-pc:1'
# 不要给自己发上线通知,用户名、主机名与飞鸽传书中的自己相同,无法区分,除非给自己改名
msg='1:%d:%s:%s:1'%(int(time.time()),user_name,hostname)
udp.sendto(msg.encode('GBK'),('255.255.255.255',port))
# 发送消息
while True:
msg=input("请输入:")
# 如果给自己发消息,用户名、主机名与飞鸽传书中的自己相同,无法区分,除非给自己改名
msg='1:%d:%s:%s:32:%s'%(int(time.time()),user_name,hostname,msg)
udp.sendto(msg.encode('gbk'),address)