2011-08-12 52 views
1

我试图从客户端发送文件到服务器,所以我加载文件在客户端的一个字节数组,并将其发送到服务器槽发送()的方法,但所接收到的阵列是不同的,比发送的阵列更大,不知是否它是一个协议的问题(但是我使用TCP协议至极保证错误检测):数据收到不同于数据发送槽通过尖锐的插座

客户机代码:

IPAddress ipAddress = new IPAddress(ip); 
IPEndPoint ipEnd = new IPEndPoint(ipAddress, 5656); 
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

FileStream fl = File.Open("pos.xls",FileMode.Open); 
byte[] fileData = ReadFully(fl); 
fl.Close(); 

byte[] clientData = new byte[ fileData.Length]; 
fileData.CopyTo(clientData,0); 

curMsg = "Connection to server ..."; 
clientSock.Connect(ipEnd); 

curMsg = "File sending..."; 
clientSock.Send(clientData); 

curMsg = "Disconnecting..."; 
clientSock.Close(); 
curMsg = "File transferred."; 

服务器代码:

curMsg = "Starting..."; 
sock.Listen(100); 

curMsg = "Running and waiting to receive file."; 
byte[] clientData = new byte[1024 * 5000]; 
while (true) 
{ 
    Socket clientSock = sock.Accept(); 

    clientData = new byte[1024 * 5000]; 

    int receivedBytesLen = clientSock.Receive(clientData); 
    curMsg = "Receiving data..."; 

    FileStream fz = writeFully(clientData); 
    fz.Close(); 
    curMsg = "Saving file..."; 

感谢你的帮助

+0

您能否显示发送和接收到的不同数据 – skyfoot

+0

您是否尝试发送一小块已知字节(例如,新字节[] {1,2,3,4,5,6}或其他),然后进行比较另一端是什么?它可能会使你指向正确的方向;例如收到的尺寸是否更大?如果是这样,它与大文件一样大吗?你发送的模式是否出现在输出数据的某处?等 – shelleybutterfly

+0

我想发送一个Excel文件(1.65 MB),我收到一个5.12 MB的文件,我敢肯定,当我发送槽网络时发生字节数组的问题,因为我检查发送之前的字节数组的大小和它是好的,并且在发送到服务器之后,它也改变了 –

回答

1

你有定义clientData = new byte[1024 * 5000]; - 你那么就不要使用receivedBytesLen。我不记得Receive超载是否会读一样,因为它可以直到EOF,或简称为“部分或EOF”(后者是Stream.Read行为),但你必须验证和使用receivedBytesLen

IMO,固定缓冲区的方法本质上是有缺陷的,因为它不能很好地处理超大的输入。我个人会在这里使用NetworkStream;那么你的整个代码变为:

using(var fz = File.Create(path)) { 
    networkStream.CopyTo(fz); 
} 

这里的另一个常见的方法是发送预期大小作为前缀的数据;这样你可以验证你有你需要的数据。我个人不会使用此信息在内存中创建一个正确大小的缓冲区,但仍然不允许史诗大小的文件(然而,Stream,但)。

+0

谢谢你,你的答案几乎奏效,只有copyto似乎不在紧凑框架中存在,所以我认为它会工作,如果我只是写我自己的方法,这不是很复杂,谢谢 –

+0

@Tarik - 在那的情况下,用一个小缓冲区循环进入你从'Read(...)'得到一些<= 0 –

+0

是的,事实上,它终于奏效了,通过编写类似于CopyTo()的方法,再次感谢你 –