有人可以告诉我 golang 中 io.ReadFull 和 bytes.

我在实现一个tcp c/s demo的时候遇到了一个问题,我发现在服务器端使用io.ReadFull(conn, aByteArr)或者bytes.Buffer.ReadFrom(conn)的时候很奇怪,好像服务器不会t 读取连接中的数据,直到客户端退出,换句话说,服务器卡住了,但我可以使用基本的 conn.Read(aBuffer) 读取数据。为什么这两种方法这么奇怪?


因为我想让我的服务器处理任意大小的数据,所以我不喜欢使用基本的方式,我的意思是 conn.Read(),它必须先制作一个指定大小的字节切片。请帮我。


我可以给我的代码:客户端:


package main


import (

    "net"

    "fmt"

    "bufio"

    "time"

    "runtime"

)


func send(s string, ch chan string){

    conn, err := net.Dial("tcp", ":4000")

    if err != nil {

        fmt.Println(err)

    }   

    fmt.Fprintf(conn, s)

    fmt.Println("send: ", s)                                                                                                                                                                                      

    /*  

    s := "server run"

    conn.Write([]byte(s))

    */

    status, err := bufio.NewReader(conn).ReadString('\n')

    if err != nil {

        fmt.Println("error: ", err)

    }   

    ch <- status 

}

func main(){

    runtime.GOMAXPROCS(runtime.NumCPU())

    fmt.Println("cpu: ", runtime.NumCPU())

    ch := make(chan string, 5)

    timeout := time.After(10 * time.Second)

    i := 0


    for{

        go send(fmt.Sprintf("%s%d", "client", i), ch) 

        i++ 

        select {

            case ret := <-ch:

                fmt.Println(ret)

            case <-timeout:

                fmt.Println("time out")

                return

        }   

    }   

}


慕森王
浏览 604回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go