英文:
Can I use mime/multipart reader for data read from a Conn?
问题
我通过TCP套接字发送了一个带有边界分隔的JSON数据。我了解到golang有一个mime/multipart读取器,我试图利用它,但没有成功。
相关的代码如下:
//我创建了一个围绕在Conn类型上的读取器,其中包含之前定义的边界
reader := multipart.NewReader(conn, MESSAGE_BOUNDARY)
//然后我有一个gopher从中读取部分/数据:
part, _ := reader.NextPart()
var line []byte
part.Read(line)
问题是,NextPart()会阻塞,而且永远不会通过。我从未收到一个PART,尽管我正在接收数据(尝试在尝试获取下一个部分之前从Conn中读取等)。我尝试用bufio读取器替换multipart读取器,并且使用ReadString可以得到我想要的结果。问题是,我不能使用单个字节作为分隔符,因为我传递的是可能包含各种字节的大型消息。任何帮助将不胜感激。
英文:
I am sending a BOUNDARY delimited JSON data through a TCP socket. I read that golang has a mime/multipart readers and I tried to utilize it, to no avail.
The code in question is:
//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)
The issue is, NextPart() blocks and it's never passed. I never get a PART, even though I am receiving data (tried reading from the Conn before trying to get the next part and so on). I tried changing the multipart reader with a bufio reader, and with ReadString I got a what I was suppose to. Problem is, I can't use a single byte to delimit, since I'm passing large messages that might contain all kinds of bytes. Any help would be appreciated.
答案1
得分: 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的块读取部分数据。
英文:
Verify that your data matches the format expected by the mime/multipart Reader
. In your case reader.NextPart()
may be blocked waiting for a proper boundary or per-part headers.
See the example under NewReader for reference:
--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
Also, make sure to check the error value returned from NextPart()
, it will tell you if there is a MIME encoding problem or a generic I/O error.
Lastly, the part.Read(line)
will not work as written above, since your line
buffer has a 0-byte capacity. If it is OK to buffer each part in memory, then use io/ioutil ReadAll as in the NewReader
example. Otherwise, declare line
as line := make([]byte, 4096)
and use a loop to read out the part data in 4KB chunks.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论