用Go语言写一个最简单的echo服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package main
import (
"log"
"net"
)
func main() {
ln, err := net.Listen("tcp", ":8080")
if err != nil {
log.Println(err)
return
}
for {
conn, err := ln.Accept()
if err != nil {
log.Println(err)
continue
}
go echoFunc(conn)
}
}
func echoFunc(c net.Conn) {
buf := make([]byte, 1024)
for {
n, err := c.Read(buf)
if err != nil {
log.Println(err)
return
}
c.Write(buf[:n])
}
}
main
函数的过程就是首先创建一个监听套接字,然后用一个 for
循环不断的从监听套接字上 Accept
新的连接,最后调用 echoFunc
函数在建立的连接上干活。关键代码是:
1
go echoFunc(conn)
每收到一个新的连接,就创建一个“线程”去服务这个连接,因此所有的业务逻辑都可以同步、顺序的编写到echoFunc
函数中,再也不用去关心网络 IO 是否会阻塞的问题。不管业务多复杂,Go 语言的并发服务器的编程模型都是长这个样子。可以肯定的是,在 linux 上 Go 语言写的网络服务器也是采用的 epoll
作为最底层的数据收发驱动,Go 语言网络的底层实现中同样存在“上下文切换”的工作,只是这个切换工作由 runtime
的调度器来做了,减少了程序员的负担。
弄明白网络库的底层实现,貌似只要弄清楚 echo 服务器中的 Listen、Accept、Read、Write 四个函数的底层实现关系就可以了。
摘自 http://skoo.me/go/2014/04/21/go-net-core/
本文网址: https://golangnote.com/topic/119.html 转摘请注明来源