我通过TCP套接字发送BOUNDARY分隔的JSON数据。我读到golang有一个mime / multipart读者,我试图利用它,但无济于事。
有问题的代码是:
//I create a reader wrapped around a Conn type with boundary previously defined
reader := multipart.NewReader(conn, MESSAGE_BOUNDARY)
//Then I have a gopher which reads the parts/data from it:
part, _ := reader.NextPart()
var line []byte
part.Read(line)
问题是,NextPart()阻止并且它永远不会传递。我从来没有得到过PART,即使我正在接收数据(在尝试获取下一部分之前尝试从Conn读取,等等)。我尝试使用bufio阅读器更改多部分阅读器,并使用ReadString我得到了我想要的。问题是,我不能使用单个字节来分隔,因为我传递的大型消息可能包含各种字节。任何帮助将不胜感激。
答案 0 :(得分:1)
确认您的数据符合mime/multipart Reader
预期的格式。在您的情况下,可能会阻止reader.NextPart()
等待正确的边界或每个部分的标题。
请参阅NewReader下的示例以供参考:
--MESSAGE_BOUNDARY\r\n
Header1: Value\r\n
Header2: Value\r\n
\r\n
<part data>\r\n
--MESSAGE_BOUNDARY\r\n
Header1: Value\r\n
\r\n
<part data>\r\n
--MESSAGE_BOUNDARY--\r\n
此外,请务必检查从NextPart()
返回的错误值,它会告诉您是否存在MIME编码问题或通用I / O错误。
最后,part.Read(line)
将无法正常工作,因为您的line
缓冲区具有0字节容量。如果可以缓冲内存中的每个部分,那么请使用NewReader
示例中的io/ioutil ReadAll。否则,将line
声明为line := make([]byte, 4096)
并使用循环以4KB块的形式读出零件数据。