加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[日常] Go语言圣经--示例: 并发的Echo服务

发布时间:2020-12-16 19:36:29 所属栏目:大数据 来源:网络整理
导读:最简单的回声服务器: import ( "io" "net" "log" ) 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 continu

最简单的回声服务器:

import (
"io"
"net"
"log"
)

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处理连接
    }   

}

func handleConn(c net.Conn) {
io.Copy(c,c) // NOTE: ignoring errors
c.Close()
}

原理:

1.io.Copy()方法func Copy(dst Writer,src Reader) (written int64,err error)

2.net.Conn类型type Conn interface { Read(b []byte) (n int,err error) Write(b []byte) (n int,err error) ...}一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口

3.io.Writertype Writer interface { Write(p []byte) (n int,err error)}4.io.Readertype Reader interface { Read(p []byte) (n int,err error)}

升级版,每条连接一个goroutine,每个goroutine中分出多个输出goroutine

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

func main() {
listener,connection aborted
continue
}
go handleConn(conn) //新建goroutines处理连接
}
}

func handleConn(c net.Conn) {
input := bufio.NewScanner(c)
for input.Scan() {
go echo(c,input.Text(),1*time.Second)
}
// NOTE: ignoring potential errors from input.Err()
c.Close()
}
func echo(c net.Conn,shout string,delay time.Duration) {
fmt.Fprintln(c,"t",strings.ToUpper(shout))
time.Sleep(delay)
fmt.Fprintln(c,shout)
time.Sleep(delay)
fmt.Fprintln(c,strings.ToLower(shout))
}

  

1.fmt.Fprintln()func Fprintln(w io.Writer,a ...interface{}) (n int,err error)

2.bufio.NewScanner() func NewScanner(r io.Reader) *Scanner func (s *Scanner) Scan() bool func (s *Scanner) Text() string

也用到了大量的7.3节 实现接口的条件

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读