GO语言网络编程之TCP (v1)
来源:互联网 发布:海洋cms自动采集插件 编辑:程序博客网 时间:2024/06/06 03:14
最近,将go语言的基础学习了一遍,感觉还得多练练才能拿得动这门语言;
在TCP通信编程基础上,将一些杂七杂八的东西(channel/defer/range/routinue/select/switch)都添进去tcp server端,tcp client端还保留比较原始的部分;
在下一篇中,计划将面向对象思想加到tcp client端。
TCP基础就不介绍了,直接上代码,代码是有些问题,不妨碍知识点的应用和理解
tcp server端
package mainimport ("fmt""net""strings"//"time")var exit_all = make(chan string)func recv_msg(conn net.Conn, quit chan<- int) {defer func() {quit <- 0}()for {recv_buf := make([]byte, 1024)lenght, err := conn.Read(recv_buf) //接受客户端数据if err != nil {break}data := string(recv_buf[:lenght])if strings.EqualFold(data, "Quit") {break} else {fmt.Printf("\rclient:%s", data) //打印客户端发送的内容fmt.Printf("\rserver:")}}}func send_msg(conn net.Conn, quit chan<- int, exit chan<- int) {var data string //输入发送的内容defer func() {quit <- 0//time.Sleep(1 * time.Second)exit <- 0}()for {data = ""fmt.Printf("server:")fmt.Scanln(&data)send_buf := []byte(data)if strings.EqualFold(data, "Exit") {break}_, err := conn.Write(send_buf) //向服务器发送数据if err != nil {fmt.Println(err)continue //发送出现错误,继续}}}func close_msg(conn net.Conn, quit <-chan int, exit <-chan int) {for {select { //此处仅仅为了用select而用case <-quit:conn.Close()fmt.Printf("\rclient is disconnected\n")fmt.Println("wait for connection...")case <-exit:exit_all <- "EXIT ALL"}}}func accept_conn(listener net.Listener) {for {conn, err := listener.Accept() //接受客户端请求if err != nil {fmt.Println(err)continue}fmt.Println("connect successfunlly!")quit, exit := make(chan int), make(chan int)go recv_msg(conn, quit)go send_msg(conn, quit, exit)go close_msg(conn, quit, exit)}}func main() {//监听端口listener, err := net.Listen("tcp", "localhost:7087")if err != nil {fmt.Println(err)return}go accept_conn(listener)for v := range exit_all {fmt.Println(v)break}}
tcp client端
package mainimport ("fmt""net""strings")func send_msg(conn net.Conn, quit chan int) {var data string //输入发送的内容for {data = ""fmt.Printf("client:")fmt.Scanln(&data)send_buf := []byte(data)_, err := conn.Write(send_buf) //向服务器发送数据if err != nil {fmt.Println(err)continue //发送出现错误,继续}}}func recv_msg(conn net.Conn, quit chan int) {var data string //收到的内容for !strings.EqualFold(data, "Quit") { //收到Quit时退出data = ""recv_buf := make([]byte, 1024)lenght, err := conn.Read(recv_buf[0:]) //接受客户端数据if err != nil {break}data = string(recv_buf[0:lenght]) //这里若不用leng,取到的data长度将会是1024fmt.Printf("\rserver:%s", data) //服务器发送的内容fmt.Printf("\rclient:")}conn.Close()quit <- 0fmt.Println("server is disconnected")}func main() {quit := make(chan int)conn, err := net.Dial("tcp", "127.0.0.1:7087") //连接服务器if err != nil {fmt.Println(err)return}fmt.Println("If you want to exit,please input Quit")go send_msg(conn, quit) //发送消息go recv_msg(conn, quit) //接收消息<-quit}<strong></strong>
1 0
- GO语言网络编程之TCP (v1)
- go语言网络编程之tcp
- GO语言网络编程之TCP (v2)
- Go语言TCP网络编程(详细)
- Go语言TCP网络编程(详细)
- Go语言网络编程
- go语言网络编程
- Go语言TCP Socket编程
- Go语言TCP Socket编程
- Go语言TCP Socket编程
- 《go语言网络编程》笔记
- Go语言简单的TCP编程
- Go语言TCP Socket通信编程
- Go并发编程之Go语言概述
- 网络编程之TCP
- 网络编程之TCP
- Go语言学习之TCP RPC
- Go语言网络编程示例-客户端篇
- 多线程与网络
- android:layout_weight新认识
- CSS常用属性和值
- python装饰器
- CSS常用属性速查表
- GO语言网络编程之TCP (v1)
- Android基础(五) Service全解析----看不见的Activity
- HTML中调用JavaScript的几种情况和规范写法
- 使AJAX异步验证用户名和密码
- HTML代码之爱心树表白
- 三种编程范式——函数式|过程式|OO
- Flask和@app.route(1)
- android四大组件讲解之activity
- LINUXMINT使用