博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[日常] Go语言圣经--示例: 并发的Echo服务
阅读量:6413 次
发布时间:2019-06-23

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

最简单的回声服务器:

package mainimport (        "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.Writer

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

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

package mainimport (        "bufio"        "fmt"        "log"        "net"        "strings"        "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处理连接        }   }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, "\t", shout)        time.Sleep(delay)        fmt.Fprintln(c, "\t", 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节 实现接口的条件

  

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

你可能感兴趣的文章
git入门与实践【转】
查看>>
WPF 虚拟键盘
查看>>
储存卡无法打开专家教您怎么数据恢复
查看>>
彼得原理
查看>>
如何利用【百度地图API】,制作房产酒店地图?(下)——结合自己的数据库...
查看>>
[20171113]修改表结构删除列相关问题3.txt
查看>>
特征选择
查看>>
在Winform程序中设置管理员权限及为用户组添加写入权限
查看>>
RTMP直播到FMS中的AAC音频直播
查看>>
多能互补提速 加快我国能源转型和现代能源体系建设
查看>>
《JavaScript设计模式》——2.5 多种调用方式——多态
查看>>
Redis开发运维实践高可用和集群架构与实践(二)
查看>>
程序员的常见“谎话”:对,这是一个已知 Bug
查看>>
如何侦查SQL执行状态
查看>>
CentOS 7 命令行如何连接无线网络
查看>>
Ubuntu 12.04上享用新版本Linux的功能
查看>>
logstash + grok 正则语法
查看>>
Zimbra开源版(v8.6)安装说明
查看>>
Android性能优化之TraceView和Lint使用详解
查看>>
linux centos7.2 安装mysq,nginx,php
查看>>