我可以使用mime / multipart阅读器从Conn读取数据吗?

时间:2014-07-07 11:06:11

标签: networking go

我通过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我得到了我想要的。问题是,我不能使用单个字节来分隔,因为我传递的大型消息可能包含各种字节。任何帮助将不胜感激。

1 个答案:

答案 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块的形式读出零件数据。