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
原创粉丝点击