猿问

服务器未从 GO 中的 TCP 客户端接收数据

你好,我在 GO 中实现了一个服务器,它从客户端读取数据并打印它。为了从网络流中读取,我从服务器上的 conn.Read() 方法中读取。


下面是我从网络流中读取一个字节的代码


// return a single byte after reading from buffer

func readByte(conn net.Conn,buf []byte,numberofbytes *int,bufCurrPos *int) (byte){

    fmt.Printf("Byte read")

    if *bufCurrPos == *numberofbytes {

        for {

                *bufCurrPos = 0

                *numberofbytes,_ = conn.Read(buf)

                if *numberofbytes ==0 {

                continue

            } else {

                break

            }

        }

    }

    b := buf[*bufCurrPos]

    *bufCurrPos++

    return b

}

现在我创建了两个将数据写入服务器的客户端。


第一个客户端使用 conn.Write() 方法写入流,而第二个方法使用 fmt.Fprintf(bufio.NewWriter(),format string) 方法写入流。


客户 1


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

if err != nil {

    checkError(err)

}

go readHandler(conn)

for {

    reader := bufio.NewReader(os.Stdin)

    text, _ := reader.ReadString('\n')

    conn.Write([]byte(text[0:len(text)-1]+"\r\n"))

}

客户 2 :


name := "hi.txt"

        contents := "bye"

        exptime := 300000

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

        if err != nil {

                t.Error(err.Error()) // report error through testing framework

        }

        scanner := bufio.NewScanner(conn)


        // Write a file


        n,err := fmt.Fprintf(bufio.NewWriter(conn), "write %v %v %v\r\n%v\r\n", name, exptime, len(contents), contents)

        if err !=nil {

                fmt.Printf("error in writing in buffer\n")

        }

服务器使用第一个客户端正确读取数据,但对于第二个客户端,它总是读取 0 字节。


我是 GO 初学者,不知道原因。有人可以帮我吗


aluckdog
浏览 138回答 1
1回答

一只萌萌小番薯

client2 应用程序必须刷新缓冲区。bw := bufio.NewWriter(conn)n,err := fmt.Fprintf(bw, "write %v %v %v\r\n%v\r\n", name, exptime, len(contents), contents)bw.Flush()应用程序还应该检查错误。bw := bufio.NewWriter(conn)_, err := fmt.Fprintf(bw, "write %v %v %v\r\n%v\r\n", name, exptime, len(contents), contents)if err != nil {     // handle error}if err := bw.Flush(); err != nil {     // handle error}fmt.Fprintf 在内部缓冲。如果这是对连接的唯一写入,则删除缓冲写入器。_, err := fmt.Fprintf(conn, "write %v %v %v\r\n%v\r\n", name, exptime, len(contents), contents)if err != nil {    // handle error}
随时随地看视频慕课网APP

相关分类

Go
我要回答