godoos 内网聊天机制详解

news/2024/12/12 21:52:56/文章来源:https://www.cnblogs.com/xpbb/p/18603520

GodoOS 是一款轻量级的云桌面系统,旨在为用户提供高效、安全的网络通信环境。其内网聊天功能不仅支持文本消息的实时传输,还具备文件传输的能力。本文将详细介绍 godoos 内网聊天机制的核心原理和技术实现。

内网聊天机制概述

godoos 的内网聊天机制基于 UDP 协议,通过定期检查在线用户并维护一个在线用户列表,确保消息只能发送给当前在线的用户。此外,文件传输功能需要用户明确同意接收,以保证数据的安全性和用户的隐私。

ARP 发现在线 IP

  • godoos 使用 ARP 协议定期扫描局域网内的所有设备,发现在线的 IP 地址。
  • 这一过程通过 CheckOnlines 函数实现,该函数每 15 秒(可配置)调用一次 CheckOnline 方法,检查客户端是否已断开连接。
func getArpCacheIPs() ([]string, error) {var cmd *exec.Cmdvar out []bytevar err errorswitch runtime.GOOS {case "windows":cmd = exec.Command("arp", "-a")case "linux":cmd = exec.Command("arp", "-n")case "darwin": // macOScmd = exec.Command("arp", "-l", "-a")default:return nil, fmt.Errorf("unsupported operating system: %v", runtime.GOOS)}out, err = cmd.Output()if err != nil {return nil, fmt.Errorf("error executing arp command: %v", err)}lines := strings.Split(string(out), "\n")var ips []stringfor _, line := range lines {fields := strings.Fields(line)if len(fields) >= 2 {ip := fields[0]if ip != "<incomplete>" && net.ParseIP(ip) != nil {ips = append(ips, ip)}}}return ips, nil
}

维护在线用户列表

  • 所有在线的用户信息被存储在 OnlineUsers 字典中,包括主机名、IP 地址、最后活跃时间等。
  • 当用户发送心跳消息(类型为 heartbeat)时,系统会更新该用户的在线状态。
func concurrentGetIpInfo(ips []string) {// 获取本地 IP 地址hostips, err := libs.GetValidIPAddresses()if err != nil {log.Printf("failed to get local IP addresses: %v", err)return}// 获取 ARP 缓存中的 IP 地址validIPs, err := getArpCacheIPs()if err != nil {log.Printf("failed to get ARP cache IPs: %v", err)return}var wg sync.WaitGroupmaxConcurrency := runtime.NumCPU()semaphore := make(chan struct{}, maxConcurrency)failedIPs := make(map[string]bool)for _, ip := range ips {if containArr(hostips, ip) || failedIPs[ip] || !containArr(validIPs, ip) {continue}wg.Add(1)semaphore <- struct{}{}go func(ip string) {defer wg.Done()defer func() { <-semaphore }()err := sendUDPPacket(ip)if err != nil {log.Printf("Failed to send packet to IP %s: %v", ip, err)failedIPs[ip] = true // 标记失败的 IP}}(ip)}wg.Wait()
}func CheckOnline() {// 清除 OnlineUsers 映射表CleanOnlineUsers()ips := libs.GetChatIPs()// 启动并发处理concurrentGetIpInfo(ips)log.Printf("online users: %v", OnlineUsers)
}func CleanOnlineUsers() {OnlineUsers = make(map[string]UserStatus)
}

消息传输

UDP 服务器

  • godoos 在 UDP 端口 56780 上启动一个监听服务,接收来自客户端的消息。
  • 接收到的消息首先进行 JSON 解析,提取出消息类型、发送方 IP 地址等信息。
func UdpServer() {// 监听 UDP 端口listener, err := net.ListenPacket("udp", ":56780")if err != nil {log.Fatalf("error setting up listener: %v", err)}defer listener.Close()log.Println("UDP server started on :56780")// 监听 UDP 请求for {buffer := make([]byte, 1024)n, remoteAddr, err := listener.ReadFrom(buffer)if err != nil {log.Printf("error reading from UDP: %v", err)continue}log.Printf("Received UDP packet from %v: %s", remoteAddr, buffer[:n])// 从 remoteAddr 获取 IP 地址udpAddr, ok := remoteAddr.(*net.UDPAddr)if !ok {log.Printf("unexpected address type: %T", remoteAddr)continue}ip := udpAddr.IP.String()// 解析 UDP 数据var udpMsg UdpMessageerr = json.Unmarshal(buffer[:n], &udpMsg)if err != nil {log.Printf("error unmarshalling UDP message: %v", err)continue}udpMsg.IP = ipif udpMsg.Type == "heartbeat" {UpdateUserStatus(udpMsg.IP, udpMsg.Hostname)continue}if udpMsg.Type == "image" {filePath, err := ReceiveImg(udpMsg)if err != nil {log.Printf("error receiving image: %v", err)continue}udpMsg.Message = filePath}// 添加消息到 UserMessagesAddMessage(udpMsg)}
}

消息处理

  • 根据消息类型,系统会调用相应的处理函数。例如,心跳消息用于更新用户状态,文件传输请求需要用户确认。
  • 所有消息会被存储在 UserMessages 字典中,以便后续查询和展示。

文件传输

  1. 文件发送请求

    • 用户发起文件发送请求时,系统会生成一条类型为 fileSending 的消息,并发送给目标用户。
    • 目标用户接收到请求后,可以选择接受或拒绝。
  2. 文件传输确认

    • 如果目标用户同意接收文件,系统会生成一条类型为 fileAccessed 的消息,通知发送方开始传输文件。
    • 文件传输完成后,系统会返回文件路径给发送方,确保文件传输成功。
  3. 文件传输取消

    • 用户也可以取消文件发送请求,系统会生成一条类型为 fileCannel 的消息,通知目标用户取消操作。

func HandlerApplySendFile(w http.ResponseWriter, r *http.Request) {var msg UdpMessagedecoder := json.NewDecoder(r.Body)if err := decoder.Decode(&msg); err != nil {http.Error(w, "Invalid request body", http.StatusBadRequest)return}defer r.Body.Close()hostname, err := os.Hostname()if err != nil {libs.ErrorMsg(w, "HandleMessage error")return}msg.Hostname = hostnamemsg.Time = time.Now()msg.Type = "fileSending"SendToIP(msg)libs.SuccessMsg(w, nil, "请求文件发送成功")
}
func HandlerCannelFile(w http.ResponseWriter, r *http.Request) {var msg UdpMessagedecoder := json.NewDecoder(r.Body)if err := decoder.Decode(&msg); err != nil {http.Error(w, "Invalid request body", http.StatusBadRequest)return}defer r.Body.Close()hostname, err := os.Hostname()if err != nil {libs.ErrorMsg(w, "HandleMessage error")return}msg.Hostname = hostnamemsg.Time = time.Now()msg.Type = "fileCannel"SendToIP(msg)libs.SuccessMsg(w, nil, "请求文件发送成功")
}
func HandlerAccessFile(w http.ResponseWriter, r *http.Request) {var msg UdpMessagedecoder := json.NewDecoder(r.Body)if err := decoder.Decode(&msg); err != nil {libs.ErrorMsg(w, "Invalid request body")return}defer r.Body.Close()hostname, err := os.Hostname()if err != nil {libs.ErrorMsg(w, "HandleMessage error")return}msg.Hostname = hostnamemsg.Time = time.Now()msg.Type = "fileAccessed"SendToIP(msg)path, err := downloadFiles(msg)if err != nil {libs.ErrorMsg(w, "HandleMessage error")return}res := map[string]interface{}{"path": path,"msg":  msg.Message,}libs.SuccessMsg(w, res, "接收文件成功")
}

安全与隐私

  • 用户确认机制:文件传输需要目标用户明确同意,确保数据的安全性和用户的隐私。
  • 在线状态检查:系统定期检查在线用户,确保消息只能发送给当前在线的用户,避免无效消息的传输。

结语

godoos 的内网聊天机制通过高效的在线用户检测和严格的消息处理流程,确保了内网通信的实时性和安全性。无论是文本消息还是文件传输,用户都能享受到便捷、可靠的通信体验。未来,godoos 将继续优化这一机制,为用户提供更加完善的内网通信解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/851589.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APP 内存泄露优化

原理 https://juejin.cn/post/6864492188404088846 分析 我的APP主要的VC路径如下:如果没有内存泄露的话,我们从一个VC_A开始push一个VC_B,无论在VC_B操作了什么,pop回到VC_A,这个时候的内存大小应该和VC_A在puhs VC_B的时候是一样大的。 如图: 页面结构:曲谱列表 push 曲…

VMware ESXi 8.0U3c macOS Unlocker OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0U3 集成驱动版,在个人电脑上运行企业级工作负载 请访问原文链接:…

12.12实验八:随机森林算法实现与测试

实验八:随机森林算法实现与测试 一、实验目的 深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。二、实验内容 (1)从 scikit-learn 库中加载 iris 数据集,使用留出法…

VMware ESXi 8.0U3c 发布 - 领先的裸机 Hypervisor

VMware ESXi 8.0U3c 发布 - 领先的裸机 HypervisorVMware ESXi 8.0U3c 发布 - 领先的裸机 Hypervisor 同步发布 Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco (思科)、Fujitsu (富士通)、Hitachi (日立)、NEC (日电)、Huawei (华为)、xFusion (超聚…

VMware ESXi 8.0U3c macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版

VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版VMware ESXi 8.0U3c macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco (思科)、Fujitsu (富士通…

使用Flex布局的几个小技巧

前情 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性,任何一个容器都可以指定为 Flex 布局,如果说目前我开发中离不开的布局方式那就非Flex莫属了,而且小程序就是推荐使用Flex布局的,对 Grid布局的支持不太理想。 在一次次使用fl…

C#学习笔记(一) Array学习笔记

之前一直学习各种基础知识,光学习,没有总结,趁着有时间,总结总结C#有关知识 Array类是最基础的数组类,官方文档截图如下:Array是一个抽象类,不能实例化,只能使用里面的方法,属性。 Array 类不是 System.Collections 命名空间的一部分。 但是,它仍被视为集合,因为它基…

VMware ESXi 7.0U3r macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版

VMware ESXi 7.0U3r macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版VMware ESXi 7.0U3r macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 7.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Fujitsu (富士通)、Hitachi…

Ubuntu 20.04虚拟机无法上网,无法访问主机

查版本 Ubuntu基于Debian发行版和GNOME桌面环境 Xubuntu(发音为ZOO-bun-too)是一个Ubuntu Linux的官方派生版,它基于桌面环境Xfce,主要运行基于GTK+的程序,面向旧式电脑的用户和寻求更快捷的桌面环境的用户。它与Ubuntu不完全相同,但使用Ubuntu的高质量软件源。 /etc/net…

帮助用户与 AI 实时练习口语,Speak 为何能估值 10 亿美元?丨Voice Agent 学习笔记

👋活动招募:如果你正在关注 Voice Agent 的开发和创业,欢迎线上参与本周日(15 日)的 Voice Agent 开发者分享会。AI 语言学习公司 Speak 近日宣布完成 7800 万美元 C 轮融资,由 Accel 领投,OpenAI 创业基金、Khosla Ventures、Y Combinator 等顶级投资机构参投。此轮融…

12C++循环结构-for循环(2)——教学

1、循环变量为字符型; 2、打擂台-for语句的另一种形式; 3、break语句; 4、数位分离一、循环变量为字符型 试编一程序,按字典顺序输出26个字母。 流程图:思考:先顺序输出26个小写英文字母,再逆序输出26个大写英文字母。 循环可以是递增型循环,也可以是递减型循环。二、打…

沈阳在线教育系统官网

针对教育和软件行业的关注,在不断发展的市场环境下,我们探讨一种新兴的趋势,即在线教育领域如何更高效、更个性化地提供优质的教育服务,尤其是利用知识付费在线教育系统的创新解决方案。图源 凸知@www.tuzhi.ltd在当前社会背景下,随着信息技术的突飞猛进,以及人们对于优质…