内容简介:一个简单的多协程并发服务器,客户端从标准输入读取内容,服务器处理后返回。专栏的介绍可以参考《CaseGolang专栏》,代码可以看案例比较简单:客户端从标准输入读取内容发送给服务器,服务器处理之后返回给客户端。
一个简单的多协程并发服务器,客户端从标准输入读取内容,服务器处理后返回。
专栏的介绍可以参考《CaseGolang专栏》,代码可以看 《宝库-Case》 。
案例比较简单:客户端从标准输入读取内容发送给服务器,服务器处理之后返回给客户端。
(中间关于读写的时候,有些小细节要注意;不展开直接看代码吧)
直接贴代码:(server.go)
package main import ( "io" "strings" "fmt" "log" "net" ) func main() { listener, err := net.Listen("tcp", "127.0.0.1:8000") if err != nil { log.Fatalln("err = ", err) } defer listener.Close() //并发接收多个请求 for { conn, err := listener.Accept() if err != nil { log.Fatalln("err = ", err) } //为每一个连接开一个协程 go HandleConn(conn) } } func HandleConn(conn net.Conn) { defer conn.Close() //获取对端地址 addr := conn.RemoteAddr().String() fmt.Println(addr + "addr connect succeed") //读取用户请求 buf := make([]byte, 1024*4) for { n, err := conn.Read(buf) if err != nil { if err != io.EOF { fmt.Println("err = ", err) } return } fmt.Println("read buf = ", string(buf[:n])) //查看读取到的内容 conn.Write([]byte(strings.ToUpper(string(buf[:n])))) //转成大写返回给客户端 } }
然后 client.go
package main import ( "os" "fmt" "net" ) /*直接发送内容*/ /* func main() { conn, err := net.Dial("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("err = ", err) return } defer conn.Close() conn.Write([]byte("big")) //发送数据 } */ //从 os.Stdin读取内容,然后在发送 func main() { conn, err := net.Dial("tcp", "127.0.0.1:8000") if err != nil { fmt.Println("dial err : ", err) return } defer conn.Close() go func() { //从键盘设备文件读 str := make([]byte, 1024) for { n, err := os.Stdin.Read(str) //读取标准输入 if err != nil { fmt.Println("os.Stdin, err = ", err) return } //把输入的内容给服务器发送 conn.Write(str[:n]) //读多少写多少 } }() //主协程负责死循环在这守着服务器的回写 //(好处是服务器关闭,这边儿可以退出; 否则放到子协程中读,主协程进行 stdin输出, //则即使读到服务器关闭的异常,程序也无法退出) buf := make([]byte, 1024) for { n, err := conn.Read(buf) //接收服务器的写回 if err != nil { fmt.Println("read err = ", err) return } fmt.Println(string(buf[:n])) //打印服务器拿过来的数据 } }
不解释了,注意下 IO 的处理,还有一种方式,判断读取的字节数 n 。
运行大致如下:
Merlin 网络小案例 upload
以上所述就是小编给大家介绍的《Golang: TCP 简单并发服务器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- GoLang 示例:并发回声服务器
- 高并发高性能服务器是如何实现的
- Nginx 之大并发服务器架构实战技法三
- Windows服务器高并发处理IOCP(完成端口)详细说明
- 【Zinx第一章-引言】Golang轻量级并发服务器框架
- 一、【Zinx第一章-引言】Golang轻量级并发服务器框架
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。