首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go语言 tcp通信例子

go语言 tcp通信例子

作者头像
李海彬
发布2018-03-27 12:56:03
1K0
发布2018-03-27 12:56:03
举报
文章被收录于专栏:Golang语言社区Golang语言社区

go 的tcp的应用层代码看起来极为简单

1,多个协程同时Accept , 不知道这种实现有没有什么问题

2,多个协程同时处理网络IO事件, 貌似意味着, 有多少个连接过来就需要有多少个协程了, 对于go来说,一个进程支持足够都的协程, 远远大于带宽的限制

服务端代码

package main

import (

       "net"

       "time"

       "fmt"

)



func ca(){

       a := recover()

       fmt.Println("Catch", a)

}

func main(){

       defer ca()



       fmt.Println("main start")

       L, e:=net.Listen("tcp", "127.0.0.1:7878")

       if e != nil{

              fmt.Println("this is null")

              panic("claa null")

       }



       for index:=0; index<10; index++{

              go handleAccept(L, index)

       }



       for{

              time.Sleep(1e9)

       }



}



func handleAccept(L  net.Listener, index int){

       for{

              fmt.Println("Accept index=", index)

              a, ae := L.Accept()

              if ae != nil{

                     fmt.Println("Accept index quit", index)

                     break

              }

              go handleConnect(a)

       }

}





func handleConnect(c  net.Conn){

       for{

              var buffer []byte = make([]byte, 1024)

              len, re := c.Read(buffer)

              if len == 0 && "EOF" == re.Error(){

                     fmt.Println("quit")

                     c.Close()

                     break

              }

              var dd string = string(buffer)

              fmt.Println(len, re, "data:", dd)

       }



}

客户端代码:

package main



import (

       "net"

       "time"

       "strconv"

       "fmt"

)



func Send(){

       conn, e := net.Dial("tcp", "127.0.0.1:7878")

       if e != nil{

              panic("e is nil")

       }



       var index int = 0

       for{

              var data string = strconv.Itoa(index)

              len, e:=conn.Write([]byte(data))

              if e != nil{

                     fmt.Println(len, e, "Close Connct")

                     conn.Close()

              }

              index = index+1

              time.Sleep(1e9)

       }



}

func main(){

       fmt.Println("client main start")

       for index:=0; index<100; index++{

              go Send()

       }

       for{

              time.Sleep(1e9)

       }

}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档