飞鸽传书-发送文件-udp消息
main.py
import threading
import socket
import time
import FeiQCoreData
import FeiQRecv
import FeiQSend
def create_udp_socket():
"""创建udp套接字"""
FeiQCoreData.udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
FeiQCoreData.udp_socket.bind(("", FeiQCoreData.feiq_port))
FeiQCoreData.udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
def print_all_online_users():
"""显示所有现在用户列表"""
for user_info in FeiQCoreData.user_list:
print(user_info)
def print_menu():
"""显示飞鸽传书的功能"""
print(" 飞鸽传书v1.0")
print("1:上线广播")
print("2:下线广播")
print("3:向指定ip发送消息")
print("4:显示所有在线的用户列表")
print("5:向指定ip发送文件")
print("0:退出")
def main():
create_udp_socket()
recv_msg_thread = threading.Thread(target=FeiQRecv.recv_msg)
recv_msg_thread.start()
while True:
print_menu()
command_num = input("请输入要进行的操作:")
if command_num == "1":
FeiQSend.send_broadcast_online_msg()
elif command_num == "2":
FeiQSend.send_broadcast_offline_msg()
elif command_num == "3":
FeiQSend.send_msg_2_ip()
elif command_num == "4":
print_all_online_users()
elif command_num == "5":
FeiQSend.send_file_msg_2_ip()
elif command_num == "0":
FeiQSend.send_broadcast_offline_msg()
FeiQCoreData.udp_socket.close()
exit()
if __name__ == "__main__":
main()
FeiQSend.py
import FeiQCoreData
import time
import os
def build_msg(command_num, option_data=""):
"""组装需要发送的消息"""
msg = "%d:%d:%s:%s:%d:%s" % (FeiQCoreData.feiq_version, int(time.time()),
FeiQCoreData.feiq_user_name, FeiQCoreData.feiq_host_name,
command_num, option_data)
return msg
def build_file_msg(file_name):
"""构建文件消息"""
try:
file_size = os.path.getsize(file_name)
file_ctime = os.path.getctime(file_name)
except:
print("(%s)文件不存在,不能发送...." % file_name)
else:
option_str = "%d:%s:%x:%x:%x:" % (0, file_name, file_size, int(file_ctime), FeiQCoreData.IPMSG_FILE_REGULAR)
command_num = FeiQCoreData.IPMSG_SENDMSG | FeiQCoreData.IPMSG_FILEATTACHOPT
file_str = "\0" + option_str
return build_msg(command_num, file_str)
def send_msg(send_data, dest_ip):
FeiQCoreData.udp_socket.sendto(send_data.encode("gbk"), (dest_ip, FeiQCoreData.feiq_port))
def send_broadcast_online_msg():
"""发送上线提醒"""
online_msg = build_msg(FeiQCoreData.IPMSG_BR_ENTRY, FeiQCoreData.feiq_user_name)
send_msg(online_msg, FeiQCoreData.broadcast_ip)
def send_broadcast_offline_msg():
"""发送下线提醒"""
offline_msg = build_msg(FeiQCoreData.IPMSG_BR_EXIT)
send_msg(offline_msg, FeiQCoreData.broadcast_ip)
def send_msg_2_ip():
"""向指定的ip发送飞秋数据"""
dest_ip = input("请输入对方的ip(输入0显示用户列表):")
if dest_ip == "0":
print("="*30)
for i, user_info in enumerate(FeiQCoreData.user_list):
print(i, user_info)
print("="*30)
num = int(input("请输入要序号:"))
dest_ip = FeiQCoreData.user_list[num]['ip']
send_data = input("请输入要发送的数据内容:")
if dest_ip and send_data:
chat_msg = build_msg(FeiQCoreData.IPMSG_SENDMSG, send_data)
send_msg(chat_msg, dest_ip)
def send_file_msg_2_ip():
"""向指定ip发送文件消息"""
dest_ip = input("请输入对方的ip(输入0显示用户列表):")
if dest_ip == "0":
print("="*30)
for i, user_info in enumerate(FeiQCoreData.user_list):
print(i, user_info)
print("="*30)
num = int(input("请输入序号:"))
dest_ip = FeiQCoreData.user_list[num]['ip']
file_name = input("请输入要发送的文件名(输入0显示当前路径下文件名):")
if file_name == "0":
print("="*30)
file_name_list = os.listdir()
for i, file_name_temp in enumerate(file_name_list):
print(i, file_name_temp)
print("="*30)
num = int(input("请输入序号:"))
file_name = file_name_list[num]
if dest_ip and file_name:
file_msg = build_file_msg(file_name)
send_msg(file_msg, dest_ip)
FeiQCoreData.py
udp_socket = None
feiq_version = 1
feiq_user_name = "dong-test"
feiq_host_name = "ubuntu-64-1604"
broadcast_ip = "255.255.255.255"
feiq_port = 2425
IPMSG_BR_ENTRY = 0x00000001
IPMSG_BR_EXIT = 0x00000002
IPMSG_SENDMSG = 0x00000020
IPMSG_ANSENTRY = 0x00000003
IPMSG_RECVMSG = 0x00000021
IPMSG_FILEATTACHOPT = 0x00200000
IPMSG_FILE_REGULAR = 0x00000001
user_list = list()
FeiQRecv.py(未修改)
import FeiQCoreData
import FeiQSend
def deal_feiq_data(recv_data):
"""处理接收到的飞秋数据"""
recv_data = recv_data.decode("gbk", errors="ignore")
feiq_data_list = recv_data.split(":", 5)
feiq_data = dict()
feiq_data['version'] = feiq_data_list[0]
feiq_data['packet_id'] = feiq_data_list[1]
feiq_data['user_name'] = feiq_data_list[2]
feiq_data['host_name'] = feiq_data_list[3]
feiq_data['command_num'] = feiq_data_list[4]
feiq_data['option'] = feiq_data_list[5]
return feiq_data
def deal_command_option_num(command_num):
"""提起命令字中的命令以及选项"""
command = int(command_num) & 0x000000ff
command_option = int(command_num) * 0xffffff00
return command, command_option
def judge_and_add_online_user(user_name, host_name, dest_ip):
"""判断这个用户是否已经存在列表中,然后添加"""
for user_info in FeiQCoreData.user_list:
if user_info['ip'] == dest_ip:
break
else:
new_online_user = dict()
new_online_user['ip'] = dest_ip
new_online_user['user_name'] = user_name
new_online_user['host_name'] = host_name
FeiQCoreData.user_list.append(new_online_user)
def judge_and_del_online_user(dest_ip):
"""用户下线,删除"""
for user_info in FeiQCoreData.user_list:
if user_info['ip'] == dest_ip:
FeiQCoreData.user_list.remove(user_info)
break
def recv_msg():
"""接收消息"""
while True:
recv_data, dest_addr = FeiQCoreData.udp_socket.recvfrom(1024)
feiq_data = deal_feiq_data(recv_data)
command, command_option = deal_command_option_num(feiq_data['command_num'])
if command == FeiQCoreData.IPMSG_BR_ENTRY:
print("%s上线" % feiq_data['option'])
find_post = feiq_data['option'].find("\0")
if find_post != -1:
user_name = feiq_data['option'][:find_post]
else:
user_name = feiq_data['option']
judge_and_add_online_user(user_name, feiq_data['host_name'], dest_addr[0])
answer_online_msg = FeiQSend.build_msg(FeiQCoreData.IPMSG_ANSENTRY)
FeiQSend.send_msg(answer_online_msg, dest_addr[0])
elif command == FeiQCoreData.IPMSG_BR_EXIT:
print("%s下线" % feiq_data['user_name'])
judge_and_del_online_user(dest_addr[0])
elif command == FeiQCoreData.IPMSG_ANSENTRY:
print("%s已经在线" % feiq_data['user_name'])
judge_and_add_online_user(feiq_data['option'][:feiq_data['option'].find("\0")], feiq_data['host_name'], dest_addr[0])
elif command == FeiQCoreData.IPMSG_SENDMSG:
print("收到新消息:%s" % feiq_data['option'])
recv_ok_msg = FeiQSend.build_msg(FeiQCoreData.IPMSG_RECVMSG)
FeiQSend.send_msg(recv_ok_msg, dest_addr[0])