簡體   English   中英

使用bufio.NewReader(conn)閱讀整個消息

[英]Read whole message with bufio.NewReader(conn)

我正在使用golang中的簡單聊天服務器和客戶端。 我在從net.conn讀取消息時遇到了一些麻煩。 到目前為止,這是我一直在做的事情:

bufio.NewReader(conn).ReadString('\n')

由於用戶按下Enter鍵發送消息,所以我只需要讀到'\\ n'。 但是我現在正在進行加密,當在客戶端和服務器之間發送公鑰時,該密鑰有時包含“ \\ n”,這使得很難獲得整個密鑰。 我只是想知道如何閱讀整個消息,而不是停在一個特定的字符上。 謝謝!

發送二進制數據的一個簡單選項是使用長度前綴。 將數據大小編碼為32位大字節序整數,然后讀取該數據量。

// create the length prefix
prefix := make([]byte, 4)
binary.BigEndian.PutUint32(prefix, uint32(len(message)))

// write the prefix and the data to the stream (checking errors)
_, err := conn.Write(prefix)
_, err = conn.Write(message)

並閱讀消息

// read the length prefix
prefix := make([]byte, 4)
_, err = io.ReadFull(conn, prefix)


length := binary.BigEndian.Uint32(prefix)
// verify length if there are restrictions

message = make([]byte, int(length))
_, err = io.ReadFull(conn, message)

另請參閱Golang:TCP客戶端/服務器數據定界符

當然,您也可以使用現有的,經過良好測試的協議(例如HTTP,IRC等)來滿足您的消息傳遞需求。 go std庫帶有一個簡單的textproto軟件包 ,或者您可以選擇將消息封裝為統一編碼,例如JSON。

暫無
暫無

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

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