当前位置:首页 > 通信技术 > 通信技术
[导读]当用户输入特定字符串时触发相应的功能。在键盘输入“r”时触发RequestRegister函数进行注册,输入“rm”时触发一个尚未定义的取消注册函数。同时还希望程序在后台持续处理SIP消息。

1、思路

  • 如何在Go中实现命令行输入的非阻塞读取

因为如果使用传统的阻塞式输入(如fmt.Scanln),程序会一直等待用户输入,无法同时处理其他任务。因此,应该使用并发机制,让输入监听和处理SIP消息可以同时进行。

  • 如何监听键盘输入

在Go中,可以使用bufio.NewReader来读取标准输入,但通常这是阻塞的。为了非阻塞地读取输入,可能需要使用goroutine来单独处理输入,这样主线程可以继续执行网络请求。

  • 如何将用户的输入与相应的函数调用绑定

当用户输入“r”时,调用RequestRegister函数;输入“rm”时,调用取消注册的函数;当用户输入“q”,则退出循环。需要设计一个循环,不断监听输入,并根据输入内容触发不同的操作。
在main函数中需要持续处理其他任务,比如接收SIP消息。这意味着主函数不能因为等待输入而阻塞。因此,使用goroutine来并发执行输入监听和其他任务是一个合理的方案。

2、实现功能的步骤

启动一个goroutine来监听键盘输入:这个goroutine会不断读取用户的输入,并根据输入内容触发相应的函数调用。
在主goroutine中处理其他任务:比如持续接收SIP消息,处理网络请求等。
处理并发访问共享资源的问题:如果RequestRegister或其他函数涉及到共享资源(比如全局的UDP连接),需要使用互斥锁(sync.Mutex)来保证线程安全。
实现取消注册函数:用户提到“rm”触发取消注册。需要设计一个函数,比如RequestUnregister,用于发送取消注册的SIP请求,类似于注册过程但使用不同的方法。

3、关键代码

// 启动输入监听
    go handleUserInput()

    // 主循环处理网络消息
    for {
        buffer := make([]byte, 2048)
        n, remoteAddr, err := conn.ReadFromUDP(buffer)
        if err != nil {
            log.Printf("读取错误: %v", err)
            continue
        }

        msg := string(buffer[:n])
        switch {
        case strings.HasPrefix(msg, "SIP/2.0 401"):
            handle401Response(msg)
        case strings.HasPrefix(msg, "NOTIFY"):
            go handleNotify(msg, remoteAddr)
        case strings.HasPrefix(msg, "SIP/2.0 200"):
            log.Println("操作成功")
        default:
            log.Printf("收到未知消息: %.200s...", msg)
        }
    }
// 处理用户输入
func handleUserInput() {
    scanner := bufio.NewScanner(os.Stdin)
    fmt.Println("命令提示:")
    fmt.Println("r - 注册")
    fmt.Println("rm - 取消注册")
    fmt.Println("q - 退出程序")

    for scanner.Scan() {
        input := strings.TrimSpace(scanner.Text())
        switch input {
        case "r":
            go func() {
                connLock.Lock()
                defer connLock.Unlock()
                if !isRegistered {
                    RequestRegister()
                    isRegistered = true
                }
            }()
        case "rm":
            go func() {
                connLock.Lock()
                defer connLock.Unlock()
                if isRegistered {
                    RequestUnregister()
                    isRegistered = false
                }
            }()
        case "q":
            os.Exit(0)
        default:
            fmt.Println("未知命令,可用命令:r/rm/q")
        }
    }
}

4、实现效果

  • 命令行交互与网络处理的完美并行
  • 线程安全的共享资源访问
  • 符合SIP标准的注册/注销流程
  • 清晰的状态管理机制
声明:该篇文章为本站原创,未经授权不予转载,侵权必究。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭