python与飞鸽传书通信(UDP)

概述

飞鸽传书是早些年常用的局域网通信工具,可以收发文字消息,也可以传输文件,本文通过python的udp编程,与飞鸽传书进行通信,了解通信协议

飞鸽传书的主要功能

  1. 上线、下线通知
  2. 收发文字消息
  3. 文件传输

飞鸽传书的通信协议

为了实现上述功能,要制定一个通信协议:

版本号:包编号:发送者姓名:发送者主机名:命令字:附加信息
  • 版本号:协议版本号,目前为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)

原文出处:/show_1EF394hfB9cl.html