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

本文共 2201 字,大约阅读时间需要 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节 实现接口的条件

  

转载地址:http://micla.baihongyu.com/

你可能感兴趣的文章
https页面与http页面自动切换----SSL解决方案
查看>>
SqlServer里DateTime转字符串
查看>>
个人项目博客----移山小分队----05
查看>>
R(rattle)实现决策树算法
查看>>
js中取el表达式问题
查看>>
tomcat7.0安装笔记
查看>>
Properties类
查看>>
凯撒加密解密
查看>>
VS2015/Visual Studio快捷键无效问题
查看>>
forfiles命令详解
查看>>
java 面向对象
查看>>
寄存器知识点
查看>>
v-if和v-show区别
查看>>
Windows安全认证是如何进行的?[NTLM篇]
查看>>
Mybatis-generator使用和扩展
查看>>
Linux :ssh sftp scp
查看>>
ipt_connlimit限制并发,ipt_recent限制单位时间内的请求数目
查看>>
POJ-1010 Stamps
查看>>
vue 动画
查看>>
代理与反向代理
查看>>