登录
首页 >  Golang >  Go问答

golang设计一个tcp服务器端接收信息

来源:SegmentFault

时间:2023-01-09 10:12:16 374浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《golang设计一个tcp服务器端接收信息》,聊聊go,希望可以帮助到正在努力赚钱的你。

问题内容

func handlerConn(conn net.Conn) {  
   //获取客户端信息 info,并返回 info+服务器时间  
  var buf [1024]byte  
 for {  
      readSize, err := conn.Read(buf[0:])  
      dealErrorWithReturn(err)  
      remoteAddr := conn.RemoteAddr()  
      fmt.Println("来自远程ip:", remoteAddr, " 的消息:", string(buf[0:readSize]))  
  
      _, err2 := conn.Write([]byte(string(buf[0:readSize]) + " " + time.Now().String()))  
      //一定要执行下面的return 才能监听到客户端主动断开,服务器端对本次conn进行close处理 dealErrorWithReturn不能达到这个效果。  
  if err2 != nil {  
         return  
  }  
   }  
}

如上,buf大小必须要指定,可是实际开发中,并不知道buf多大,请问,怎么设计这个buf的大小?

正确答案

一般情况下,这个大小是知道的,下面列举几种情况:

  1. web 服务器收到请求时,首部
    Content-Length
    就指定的包体的大小;
  2. 自己编写tcp服务器的时候,因为tcp是基于流的,不能区分边界。所以一般我们在消息的前面增加几个字节的长度信息,2字节或者4字节。例如要发一个Hello World!,长度为12,将12转成网络字节序,然后放在消息前发送,再发送消息。服务器收到消息时,先读取到长度12,然后分配buff,读取剩下的消息。

另外

io/ioutil
提供了
ReadAll
方法,从一个
io.Reader
中读取字符串,直到遇到
io.EOF
结束。

它的实现也很简单,就是先分配1024的长度,然后读取数据,

io.Reader
会返回读取数据的长度,如果未遇到
io.EOF
且读取的长度是1024,那么再分配2048的空间,将前1024字节拷贝过来,继续读取,直到结束或出错。

今天带大家了解了go的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表