GolangNote

Golang笔记

用Go语言写一个最简单的echo服务器

Permalink

用Go语言写一个最简单的echo服务器

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 函数在建立的连接上干活。关键代码是:

Go: 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 转摘请注明来源

Related articles

Go 1.5.1 更新的功能

Go 1.5.1版本对编译器,汇编器, fmt, net/textproto, net/http, 和 runtime 包的 bug 修复。...

vuego: 用GO编写 vue.js 前端

vuego 是一个基于WASM 对Vue.js 的封装,使用Web Assembly 编译。可以让开发者用go 来写Vue.js 前端脚本。...

Go Modules 使用备忘

简单Go Modules 就是包管理,从 go1.11 开始支持,可以不需要gopath存在,环境变量`GO111MODULE`,默认为 `auto` 项目存在 `go.mod` 则使用 go module ,否则使用GOPATH 和 vendor 机制。...

Write a Comment to "用Go语言写一个最简单的echo服务器"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.20 Processed in 0ms