为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
aluckdog 2021-12-07 14:45:48
你好,我在 GO 中实现了一个服务器,它从客户端读取数据并打印它。为了从网络流中读取,我从服务器上的 conn.Read() 方法中读取。下面是我从网络流中读取一个字节的代码// return a single byte after reading from bufferfunc 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) 方法写入流。客户 1conn, 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 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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

}


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 137 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信