go net包简记

 

TCP服务端

go语言中可以每次建立一次链接就创建一个goroutine去处理,使用goroutine实现并发非常方便和高效。

TCP服务端程序的一般处理流程
1.建立并绑定 Socket:首先服务端使用 socket() 函数建立网络套接字,然后使用 bind() 函数为套接字绑定指定的 IP 和端口;

2.监听请求:接下来,服务端使用 listen() 函数监听客户端对绑定 IP 和端口的请求;

3.接收连接:如果有请求过来,并通过三次握手成功建立连接,则使用 accept() 函数接收该链接;

4.创建goroutine去处理链接:服务端通过 read() 函数从上述已建立连接读取客户端发送的请求数据,经过处理后再通过 write() 函数将响应数据发送给客户端

TCP客户端的一般处理流程
1.建立 Socket:客户端同样使用 socket()函数建立网络套接字;

2.建立连接:建立连接:然后调用 connect() 函数传入 IP 和端口号建立与指定服务端网络程序的连接;

3.发送请求与接收响应:连接建立成功后,客户端就可以通过 write() 函数向服务端发送数据,并使用 read() 函数从服务端接收响应。

TCP服务器

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package main
 
import (
    "fmt"
    "log"
    "net"
)
 
func chkError(err error) {
    if err != nil {
        log.Fatal(err);
    }
}
 
func main() {
    //创建一个TCP服务端
    tcpaddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8081");
    chkError(err);
    //监听端口
    tcplisten, err2 := net.ListenTCP("tcp", tcpaddr);
    chkError(err2);
    fmt.Println("Server Start")
    //.建立链接并处理
    go func(){
        for {
            //如果有客户端链接过来,阻塞会返回
            conn, err := tcplisten.AcceptTCP()
            if err != nil {
                fmt.Println("Accept err", err)
                continue
            }
            //已经与客户端建立链接,处理业务
            go func() {
                for {
                    buf := make([]byte, 512)
                    cnt, err := conn.Read(buf)
                    if err != nil {
                        fmt.Println("recv buf err", err)
                        continue
                    }
                    //回显功能
                    if _, err := conn.Write(buf[:cnt]); err != nil {
                        fmt.Println("write bak buf err", err)
                        continue
                    }
                }
            }()
        }
    }()
    //阻塞状态
    select {}
}

TCP客户端

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
package main
 
import (
    "fmt"
    "net"
    "time"
)
 
func main(){
    //1.创建链接远程链接服务器,得到一个conn链接
    conn,err := net.Dial("tcp","127.0.0.1:8081")
    if err != nil {
        fmt.Println("client start err,exit!")
        return
    }
    i := 1
    for {
        //2.调用链接Write写数据
        _,err := conn.Write([]byte(fmt.Sprintf("%s:%d", "Hello Server", i)))
        if err != nil {
            fmt.Println("write conn err", err)
            return
        }
 
        buf := make([]byte,512)
        cnt,err := conn.Read(buf)
        if err != nil{
            fmt.Println("read buf err")
            return
        }
        fmt.Printf("Server call back:%s,cnt = %d\n",buf,cnt)
        i++
        time.Sleep(1)
    }

  

 

posted @   -零  阅读(1006)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
历史上的今天:
2019-02-17 Django之setting文件
2019-02-17 Diango之通过form表单向服务端发送数据
2019-02-17 Django之win7下安装与命令行工具
点击右上角即可分享
微信分享提示