多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 简介 ![](https://box.kancloud.cn/40138129df6d4e0980447f7eb923f815_1262x1452.png) `establish connection`是建立连接 `data transfer`数据传输 `close connection`关闭连接 ![](https://box.kancloud.cn/1f45b87dcb89104f5a114dab66ec1093_3046x856.png) # 服务端 ~~~ import ( "net" "fmt" ) func main() { // 指定服务器 通信协议、IP地址、port。 创建一个用于监听的 socket listener, err := net.Listen("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("net.Listen err:", err) return } defer listener.Close() fmt.Println("服务器等待客户端建立连接...") // 阻塞监听客户端连接请求, 成功建立连接,返回用于通信的socket conn, err := listener.Accept() if err != nil { fmt.Println("listener.Accept() err:", err) return } defer conn.Close() fmt.Println("服务器与客户端成功建立连接!!!") // 读取客户端发送的数据 buf := make([]byte, 4096) n, err := conn.Read(buf) if err != nil { fmt.Println("conn.Read err:", err) return } conn.Write(buf[:n]) // 读多少写多少。原封不动 // 处理数据—— 打印 fmt.Println("服务器读到数据:", string(buf[:n])) } ~~~ # 客户端 ~~~ import ( "net" "fmt" ) func main() { // 指定 服务器 IP + port 创建 通信套接字。 conn, err := net.Dial("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("net.Dial err:", err) return } defer conn.Close() // 主动写数据给服务器 conn.Write([]byte("Are you Ready?")) buf := make([]byte, 4096) // 接收服务器回发的数据 n, err := conn.Read(buf) if err != nil { fmt.Println("conn.Read err:", err) return } fmt.Println("服务器回发:", string(buf[:n])) } ~~~ # 并发服务器 ## 并发服务端 ~~~ package main import ( "net" "fmt" "strings" ) func HandlerConnect(conn net.Conn) { defer conn.Close() // 获取连接的客户端 Addr addr := conn.RemoteAddr() fmt.Println(addr, "客户端成功连接!") // 循环读取客户端发送数据 buf := make([]byte, 4096) for { n, err := conn.Read(buf) //fmt.Println(buf[:n]) if "exit\n" == string(buf[:n]) || "exit\r\n" == string(buf[:n]) { fmt.Println("服务器接收的客户端退出请求,服务器关闭") return } if n == 0 { fmt.Println("服务器检测到客户端已关闭,断开连接!!!") return } if err != nil { fmt.Println("conn.Read err:", err) return } fmt.Println("服务器读到数据:", string(buf[:n])) // 使用数据 // 小写转大写,回发给客户端 conn.Write([]byte(strings.ToUpper(string(buf[:n])))) } } func main() { // 创建监听套接字 //listener, err := net.Listen("tcp", "127.0.0.1:8001") listener, err := net.Listen("tcp", "192.168.15.78:8001") if err != nil { fmt.Println("net.Listen err:", err) return } defer listener.Close() // 监听客户端连接请求 for { fmt.Println("服务器等待客户端连接...") conn, err := listener.Accept() if err != nil { fmt.Println("listener.Accept err:", err) return } // 具体完成服务器和客户端的数据通信 go HandlerConnect(conn) } } ~~~ ## 并发客户端 ~~~ import ( "net" "fmt" "os" ) func main() { // 主动发起连接请求 conn, err := net.Dial("tcp", "192.168.15.78:8001") if err != nil { fmt.Println("net.Dial err:", err) return } defer conn.Close() // 获取用户键盘输入( stdin ),将输入数据发送给服务器 go func() { str := make([]byte, 4096) for { n, err := os.Stdin.Read(str) if err != nil { fmt.Println("os.Stdin.Read err:", err) continue } //写给服务器, 读多少,写多少! conn.Write(str[:n]) } }() // 回显服务器回发的大写数据 buf := make([]byte, 4096) for { n, err := conn.Read(buf) if n == 0 { fmt.Println("检查到服务器关闭,客户端也关闭") return } if err != nil { fmt.Println("conn.Read err:", err) return } fmt.Println("客户端读到服务器回发:", string(buf[:n])) } } ~~~