前面一篇文章写到的实现服务器只能连接一个客户端,没有发挥出go语言的协程特性,所以又可用如下方法实现高并发,多个客户端连接来完成:
代码语言:javascript复制package main
import (
"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]))))
}
}