【发布时间】:2012-03-06 19:16:25
【问题描述】:
我在使用套接字通过网络发送以下 140kb 图像文件时遇到问题:
文件的开头被正确传输,然后其余部分变得混乱,导致以下结果:
我有一个等待文件的服务器和一个连接到服务器并启动文件传输的客户端。当客户端关闭连接时,服务器知道文件已经发送完毕并保存。
在写入文件之前,服务器端的所有数据都在字节列表(GLOBAL.FILE_BUFFER)中收集:
public void OnDataReceived(IAsyncResult asyn)
{
try
{
SocketPacket socketData = (SocketPacket)asyn.AsyncState;
int iRx = socketData.m_currentSocket.EndReceive(asyn);
for (int f = 0; f < iRx; f++)
{
GLOBAL.FILE_BUFFER.Add(socketData.dataBuffer[f]); // Collect all the incoming data into a buffer
}
WaitForData(socketData.m_currentSocket, socketData.socket_id, REQUEST_INDEX_ID);
}
catch (ObjectDisposedException)
{
}
catch (SocketException se)
{
}
}
这是我用来写入文件的代码:
public static void ByteArrayToFile(string _FileName, byte[] _ByteArray, int BytesRead)
{
System.IO.FileStream _FileStream = new System.IO.FileStream(_FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write);
_FileStream.Write(_ByteArray, 0, BytesRead);
_FileStream.Close();
}
我在 cient 端使用了相同的 ByteArrayToFile 函数,它正确保存了图像。看起来客户端正在发送正确的数据,但是当服务器收到它时,它就搞砸了。我通过客户端和服务器在两端保存文件,然后比较它们:
注意底部中心的紫色线/条。它表示数据在那里不匹配,但请注意它在开始时完美匹配..
我不明白这怎么会发生,因为我正在使用列表,并且只是继续添加到字节列表中,直到没有任何内容可供阅读!?如果您没有解决方案,您可以给我任何提示吗?这个问题困扰了我好几个星期,很想最终解决它。谢谢!
【问题讨论】:
-
你验证过你发送的byte[]里面的数据和图片生成的byte[]是一样的吗?贴出生成字节[]的代码
-
@Ramhound 抱歉,我不确定你的意思。客户端从网络上获取图像,然后将其上传到服务器。当我从 httpwebresponse 收集客户端字节列表中的所有数据时,我保存图像,以验证它是否有效并且它被保存并工作。如果这是您的问题,请告诉我。谢谢!