本文共 994 字,大约阅读时间需要 3 分钟。
前面一篇文章写到的实现服务器只能连接一个客户端,没有发挥出go语言的协程特性,所以又可用如下方法实现高并发,多个客户端连接来完成:
package mainimport ( "fmt" "net" "strings")// 服务器Read读客户端,返回0 说明对端关闭func main() { // 创建监听套接字 listener, err := net.Listen("tcp", "127.0.0.1:8001") if err != nil { fmt.Println("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) }}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) if n == 0 { fmt.Println("服务器检测到客户端已关闭,断开连接") // 这里关闭的只是go线程,main线程还是在for循环的 return } if err != nil { fmt.Println("conn Read err", err) return } fmt.Println("服务器读到数据:", string(buf[:n])) // 小写转大写回发 conn.Write([]byte(strings.ToUpper(string(buf[:n])))) }}
转载地址:http://eqpv.baihongyu.com/