我正在使用asyn套接字。我有一个回调函数'onDataReceived',只要我收到任何数据就会触发它。
首先我一次得到一个char,所以我将socketPacket数据缓冲区更改为一个大数组。现在,当我收到数据时,我立即得到所有数据,但是当我尝试发送更大的文件时,一旦超过数组大小,它就无法工作。
我的问题是这个。我有一个多线程套接字服务器。如何在收到所有数据时确定?例如,我需要发送一个图像,我将图像编码为base64并构造一个命令“BASE64IMAGE”,然后服务器读取字符串,直到它达到END_OF_DATA?有更好的方法吗?谢谢!
答案 0 :(得分:5)
我的问题是这个。我有一个多线程套接字服务器。如何在收到所有数据时确定?
发送“消息”有三种标准选项(无论是图像还是其他任何内容 - 可能很大的整个数据块):
就个人而言,我喜欢最后一个选项 - 它可以读取数据,并确保你比前两个选项简单得多。您可以在开始之前分配适当数量的内存来接收数据等。但是,如果在开始之前不知道消息大小,则无法很好地应对。您可以通过为单个消息设置多个“块”来修改方案,其中您发送块大小然后发送数据,块大小为0表示数据结束。
请注意,如果您只通过套接字传输数据,并且不需要它是7位干净的ASCII,我将不会转换先到Base-64。只需将其作为二进制数据传输 - 您的代码将在时间和带宽上更简单,更高效。
答案 1 :(得分:0)
您可以先发送您要发送的字节数。接收方首先读取它,然后知道将来会有很多字节。
例如,您对文件进行编码并确定编码大小为800字节。您发送数字800(例如,四个字节),然后发送文件。
接收方读取4个字节,获取数字800,然后知道读取800个字节以接收整个文件。
这称为长度前缀。