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) } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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下安装与命令行工具