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

时间:2016-01-20 06:26:22

标签: go

您好我在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中很开心,不知道原因。 有人可以帮助我吗

1 个答案:

答案 0 :(得分:2)

client2应用程序必须flush缓冲区。

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
}