博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[日常] Go语言圣经-基于select的多路复用习题
阅读量:6570 次
发布时间:2019-06-24

本文共 2093 字,大约阅读时间需要 6 分钟。

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

reverb3.go

package mainimport (        "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()}

  

转载于:https://www.cnblogs.com/taoshihan/p/8995716.html

你可能感兴趣的文章
基于 jQuery & CSS3 实现智能提示输入框光标位置
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
java加密解密___MD5的简单使用
查看>>
ThreadLocal分析
查看>>
mysql优化:连接数
查看>>
github的使用(git shell )
查看>>
如何优化js代码(1)——字符串的拼接
查看>>
PHP 时间操作 / 跳转问题
查看>>
Windows 2012 R2 FSMO角色相关小记录
查看>>
2017年6月12日笔记
查看>>
(小蚂蚁站长吧)网站优化做好这八步你就是seo第一
查看>>
使用流的方式往页面前台输出图片
查看>>
java核心技术反射
查看>>
我的友情链接
查看>>
Maven创建新的依赖项目
查看>>
2015年10月26日作业
查看>>
LAMP,安装脚本
查看>>
面向对象题目
查看>>
Java异常总结
查看>>