Go语言之进阶篇简单版并发服务器
1、简单版并发服务器
示例1:
package main import ( "fmt" "net" "strings" ) //处理用户请求 func HandleConn(conn net.Conn) { //函数调用完毕,自动关闭conn defer conn.Close() //获取客户端的网络地址信息 addr := conn.RemoteAddr().String() fmt.Println(addr, " conncet sucessful") buf := make([]byte, 2048) for { //读取用户数据 n, err := conn.Read(buf) if err != nil { fmt.Println("err = ", err) return } fmt.Printf("[%s]: %s\n", addr, string(buf[:n])) fmt.Println("len = ", len(string(buf[:n]))) //if "exit" == string(buf[:n-1]) { //nc测试 if "exit" == string(buf[:n-2]) { //自己写的客户端测试, 发送时,多了2个字符, "\r\n" fmt.Println(addr, " exit") return } //把数据转换为大写,再给用户发送 conn.Write([]byte(strings.ToUpper(string(buf[:n])))) } } func main() { //监听 listener, err := net.Listen("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("err = ", err) return } defer listener.Close() //接收多个用户 for { conn, err := listener.Accept() if err != nil { fmt.Println("err = ", err) return } //处理用户请求, 新建一个协程 go HandleConn(conn) } }
执行结果: 打开nc客户端:
2、简单版并发服务器
示例2:
tcp_server.go
package main import ( "fmt" "net" "strings" ) //处理用户请求 func HandleConn(conn net.Conn) { //函数调用完毕,自动关闭conn defer conn.Close() //获取客户端的网络地址信息 addr := conn.RemoteAddr().String() fmt.Println(addr, " conncet sucessful") buf := make([]byte, 2048) for { //读取用户数据 n, err := conn.Read(buf) if err != nil { fmt.Println("err = ", err) return } fmt.Printf("[%s]: %s\n", addr, string(buf[:n])) fmt.Println("len = ", len(string(buf[:n]))) //if "exit" == string(buf[:n-1]) { //nc测试 if "exit" == string(buf[:n-2]) { //自己写的客户端测试, 发送时,多了2个字符, "\r\n" fmt.Println(addr, " exit") return } //把数据转换为大写,再给用户发送 conn.Write([]byte(strings.ToUpper(string(buf[:n])))) } } func main() { //监听 listener, err := net.Listen("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("err = ", err) return } defer listener.Close() //接收多个用户 for { conn, err := listener.Accept() if err != nil { fmt.Println("err = ", err) return } //处理用户请求, 新建一个协程 go HandleConn(conn) } }
tcp_client.go
package main import ( "fmt" "net" "os" ) func main() { //主动连接服务器 conn, err := net.Dial("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("net.Dial err = ", err) return } //main调用完毕,关闭连接 defer conn.Close() go func() { //从键盘输入内容,给服务器发送内容 str := make([]byte, 1024) for { n, err := os.Stdin.Read(str) //从键盘读取内容, 放在str if err != nil { fmt.Println("os.Stdin. err = ", err) return } //把输入的内容给服务器发送 conn.Write(str[:n]) } }() //接收服务器回复的数据 //切片缓冲 buf := make([]byte, 1024) for { n, err := conn.Read(buf) //接收服务器的请求 if err != nil { fmt.Println("conn.Read err = ", err) return } fmt.Println(string(buf[:n])) //打印接收到的内容, 转换为字符串再打印 } }
执行结果: