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 清理模块缓存

随着模块不断升级,时间久了,`pkg` 目录越来越大,导致专门为 Linux 下编译开的虚拟机空间爆满。...

golang rot13 简单加密字符

ROT13 是一种简单的字符加密方法,把 26 个英文字母的前 13 个字母与后 13 个字母的编码互换。...

Golang实现简单的Socks5代理

Socks5 代理较 `http/https` 代理有较好的性能,下面是借鉴某个著名开源软件的 local 实现的简单代理。...

Go 1.5.1 更新的功能

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

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

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