簡體   English   中英

服務器未從GO中的TCP客戶端接收數據

[英]Server not receiving Data from TCP Client in 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的初學者,不知道其原因。 有人可以幫我嗎

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM