Golang 如何從socket讀出所有數據


第一種:

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
}

要想玩得爽,還是用第一種比較靠譜。知根知底。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM