Golang 如何从socket读出所有数据

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

第一种:

func read(conn *net.Conn) error {
        defer conn.Close()

        buf := make([]byte, 0, 4096)
        len := 0

        for {
                n, err := conn.Read(buf[len:])
                if n > 0 {
                       len += n
                }
                if err != nil {
                        if err != io.EOF {
                                //Error Handler                                                                                            
                        }

                        break
                }
        }

        // buf[:len] is the content                                                                                                        
}

 第二种,更给力的一种方法:

func read2(conn *net.Conn) error {
        defer conn.Close()

        var buf bytes.Buffer

        _, err := io.Copy(&buf, conn)
	if err != nil {
                // Error handler                                                                                                           
                return err
        }

        return nil
}

从io.Copy的实现来看,它实际上跟第一种的实现非常像。它先从conn中读出最多32KB的数据,然后调用buf的Write方法将这些数据写入到buf中。 

第三种:

func read3(conn *net.Conn) error {
	defer conn.Close()

        buf, err = ioutil.ReadAll(conn)
        if err != nil {
                // Error Handler                                                                                                           
                return err
        }

        // use buf...                                                                                                                      

        return nil
}

要想玩得爽,还是用第一种比较靠谱。知根知底。

 


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

本文来自:博客园

感谢作者:cobbliu

查看原文:Golang 如何从socket读出所有数据

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

12270 次点击  
加入收藏 微博
被以下专栏收入,发现更多相似内容
上一篇:go -mongodb
1 回复  |  直到 2018-07-03 15:52:56
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传