飞鸽传书-上下线-命令版


from socket import *
import time
import os

udp_socket = None
feiQ_port = 2425
feiQ_version = 1
feiQ_user_name = "dongge-test"
feiQ_host_name = "mac-pro"
broadcast_ip = "255.255.255.255"

# 飞秋command
IPMSG_BR_ENTRY = 0x00000001
IPMSG_BR_EXIT = 0x00000002


def create_udp_socket():
    """创建udp套接字"""
    global udp_socket

    # 1. 创建socket
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    # 2. 绑定2425端口
    udp_socket.bind(("", feiQ_port))
    # 3. 设定允许广播
    udp_socket.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)


def send_broadcast_online():
    """发送上线广播"""

    # 1:1500816649:dongge-test:mac-pro:1:dongge-test
    msg = "%d:%d:%s:%s:%d:%s" % (feiQ_version, int(time.time()), feiQ_user_name, feiQ_host_name, IPMSG_BR_ENTRY, feiQ_user_name)

    # print(msg)  # for test

    # 因为windows是使用是gbk编码所以需要编码为gbk
    udp_socket.sendto(msg.encode('gbk'), (broadcast_ip, feiQ_port))


def send_broadcast_offline():
    """发送下线广播"""

    # 1:1500816649:dongge-test:mac-pro:2:dongge-test
    msg = "%d:%d:%s:%s:%d:%s" % (feiQ_version, int(time.time()), feiQ_user_name, feiQ_host_name, IPMSG_BR_EXIT, feiQ_user_name)

    # print(msg)  # for test

    # 因为windows是使用是gbk编码所以需要编码为gbk
    udp_socket.sendto(msg.encode('gbk'), (broadcast_ip, feiQ_port))


# -----新添加-----
def command_menu():
    """打印命令功能菜单"""
    os.system("clear")  # 清屏
    print("     飞鸽传书(python)-v1.0")
    print(" 1: 发送上线广播")
    print(" 2: 发送下线广播")
    print(" 0: 退出飞秋")
    print("")
    command_str = input("请输入数字:")
    return command_str


def main():
    """完成整体控制"""

    # 1. 创建udp套接字
    create_udp_socket()

    # 2. 在while循环中获取用户的指令,然后进行相应的操作
    while True:

        # 打印功能菜单
        command_str = command_menu()

        if command_str == "1":
            # 发送上线广播
            send_broadcast_online()
        elif command_str == "2":
            # 发送下线广播
            send_broadcast_offline()
        elif command_str == "0":
            # 先发送下线提醒
            send_broadcast_offline()
            # 程序退出
            exit()


if __name__ == '__main__':
    main()