• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

[日常]Go语言圣经-基于select的多路复用习题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

练习 8.8: 使用select来改造8.3节中的echo服务器,为其增加超时,这样服务器可以在客户端10秒中没有任何喊话时自动断开连接。

reverb3.go

package main

import (
        "bufio"
        "fmt"
        "log"
        "net"
        "strings"
        "sync"
        "time"
)

func main() {
        listener, err := net.Listen("tcp", ":8040")
        if err != nil {
                log.Fatal(err)
        }

        for {
                conn, err := listener.Accept()
                if err != nil {
                        log.Print(err) // e.g., connection aborted
                        continue
                }
                go handleConn(conn) //新建goroutines处理连接
        }
}
/*
1.启动一个goroutine,for死循环让他不能断掉
select语句case判断两个channel
一个是10秒后断掉连接
另一个是接收标准输入后发送过来的channel,接收到值后,启动goroutinue输出

2.for循环接收标准输入,接收到后发送给message的channel
*/
func handleConn(c net.Conn) {
        input := bufio.NewScanner(c)
        var wg sync.WaitGroup
        var message = make(chan string)
        wg.Add(1)
        go func() {
                defer wg.Done()
                for {
                        select {
                        case <-time.After(10 * time.Second):
                                c.Close()
                        case mes := <-message:
                                wg.Add(1)
                                go func(c net.Conn, shout string, delay time.Duration) {
                                        defer wg.Done()
                                        fmt.Fprintln(c, "\t", strings.ToUpper(shout))
                                        time.Sleep(delay)
                                        fmt.Fprintln(c, "\t", shout)
                                        time.Sleep(delay)
                                        fmt.Fprintln(c, "\t", strings.ToLower(shout))
                                        //ch<-struct{}{}

                                }(c, mes, 1*time.Second)

                        }
                }
        }()
        for input.Scan() {
                text := input.Text()
                message <- text
        }

        wg.Wait()
        //cw := c.(*net.TCPConn)
        //cw.CloseWrite()

        c.Close()
}

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
63_Go基础_1_30递归发布时间:2022-07-10
下一篇:
[golang] go 常用命令发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap