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

标签 networking go

我正在通过 TCP 套接字发送边界分隔的 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() 阻塞并且从未通过。我从来没有得到一个部分,即使我正在接收数据(在尝试获取下一部分之前尝试从 Conn 读取等等)。我尝试用 bufio 阅读器更改多部分阅读器,使用 ReadString 我得到了我想要的。问题是,我不能使用单个字节来定界,因为我正在传递可能包含各种字节的大消息。任何帮助将不胜感激。

最佳答案

验证您的数据是否符合 mime/multipart Reader 预期的格式。在您的情况下,reader.NextPart() 可能会被阻塞,等待正确的边界或每个部分的 header 。

请参阅 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 字节。如果可以在内存中缓冲每个部分,则使用 io/ioutil ReadAllNewReader 示例中所示。否则,将 line 声明为 line := make([]byte, 4096) 并使用循环以 4KB block 读取部分数据。

关于networking - 我可以使用 mime/multipart 阅读器从 Conn 读取数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24609145/

相关文章:

networking - NETCONF(.Yin/Yang 文件)中的 include 和 import 语句有什么区别

java - 在java中使用socket填充html表单

go - Golang以指定的精度将float编码为JSON

go - 系统休眠后 time.Time.Sub() 计算错误

windows - IPv6 链路本地地址格式

networking - 环回地址的真实示例

networking - 在 Linux 内核中创建数据包的教程

postgresql - 在go中保留来自postgresql时间戳的时区信息

戈朗 : Why must you dereference a FileInfo pointer to be able to access its members

mongodb - 如何删除 Mongodb/Golang 中的数组项?