Go语言之网络编程
一、网络编程基础
二、TCP Socket编程
(一)流程
首先应该了解服务端和客户端的处理流程:
1、服务端处理流程
- 监听端口
- 接收客户端tcp链接,建立双方的链接
- 创建goroutine,处理该链接的请求
2、客户端处理流程
- 建立与服务端的链接
- 与服务端进行通信
- 关闭链接
(二)代码实现
1、服务端(server.go)
package main import ( "fmt" "net" ) func processReq(conn net.Conn) { // 延时关闭conn defer conn.Close() // 与服务端进行通讯 for { // 创建一个切片,盛放消息 buf := make([]byte, 1024) // 1、等待客户端通过conn发送消息 // 2、如果没有消息,协程就阻塞在这里 m, err := conn.Read(buf) if err != nil { fmt.Println("客户端退出") return } // 3、显示客户端发送的内容 fmt.Print(string(buf[:m])) } } func main() { fmt.Println("服务器开始监听,等待客户端的连接:") ls, err := net.Listen("tcp", "0.0.0.0:9000") if err != nil { return } // 延时关闭listen defer ls.Close() // 等待客户端连接 for { fmt.Println("等待客户端来连接:") conn, err := ls.Accept() if err != nil { return } else { fmt.Printf("con=%v, 客户端ip=%v\n", conn, conn.RemoteAddr().String()) } // 每一个客户端启动一个协程处理,防止过长时间相应 go processReq(conn) //conn接口类型,是引用 } }
2、客户端(client.go)
package main import ( "bufio" "fmt" "net" "os" ) func main() { conn, err := net.Dial("tcp", "127.0.0.1:9000") if err != nil { return } reader := bufio.NewReader(os.Stdin) // 进行通讯 for { line, err := reader.ReadString('\n') if err != nil { fmt.Println("客户端读取终端输入出错了...") } // 将line数据发送到服务器 _, err = conn.Write([]byte(line)) if err != nil { fmt.Println("客户端发送数据出错了...") } } }
作者:iveBoy
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。