go tcp通信

jinjiashan · · 2321 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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

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

 

服务端代码

ackage 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)
       }
}

 

 


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2321 次点击  ∙  1 赞  
加入收藏 微博
下一篇:go http服务
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传