大佬教程收集整理的这篇文章主要介绍了[日常] Go语言圣经-基于select的多路复用习题,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
练习 8.8: 使用SELEct来改造8.3节中的echo服务器,为其增加超时,这样服务器可以在客户端10秒中没有任何喊话时自动断开连接。
reverb3.go
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,shout)
time.Sleep(delay)
fmt.Fprintln(c,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()
}
以上是大佬教程为你收集整理的[日常] Go语言圣经-基于select的多路复用习题全部内容,希望文章能够帮你解决[日常] Go语言圣经-基于select的多路复用习题所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。