2017-04-22 31 views
0

在我的项目中,我使用StreamSocket发送文件和StreamSocketListener接收LAN中的文件。但是,当我测试时,我收到的文件大小小于我发送的文件(例如,我发送的文件大小约为100M,收到的文件大小只有2-3M)使用StreamSocket传输文件和接收错误数据(UWP)

我非常困惑,这里是我的代码,tks。

发送代码(文件StorageFile,项目是我的自定义类)

var fileStream = await file.OpenStreamForReadAsync(); 
var fileInputStream = fileStream.AsInputStream(); 

StreamSocket socket = new StreamSocket(); 
HostName serverHost = new HostName(item.Address); 
string serverPort = item.Port; 
await socket.ConnectAsync(serverHost, serverPort); 

uint capacity = 10000000; 
Windows.Storage.Streams.Buffer buffer = new Windows.Storage.Streams.Buffer(capacity); 

// Send some heads 
StreamWriter streamWriter = new StreamWriter(socket.OutputStream.AsStreamForWrite()); 
await streamWriter.WriteLineAsync("file"); 
await streamWriter.WriteLineAsync(file.Name); 
await streamWriter.FlushAsync(); 

var outputStream = socket.OutputStream; 

while (true) 
{ 
    await fileInputStream.ReadAsync(buffer, capacity, InputStreamOptions.None); 

    if (buffer.Length > 0) 
    { 
     await outputStream.WriteAsync(buffer); 
     await outputStream.FlushAsync(); 
    } 
    else 
    { 
     break; 
    } 
} 

streamWriter.Dispose(); 
outputStream.Dispose(); 
socket.Dispose(); 

接收代码(事件是StreamSocketListener.ConnectionReceived

StreamReader streamReader = new StreamReader(args.Socket.InputStream.AsStreamForRead()); 
string head = await streamReader.ReadLineAsync(); 

string fileName = await streamReader.ReadLineAsync(); 

StorageFile file = await DownloadsFolder.CreateFileAsync(fileName, CreationCollisionOption.GenerateUniqueName); 
var inputStream = args.Socket.InputStream; 

uint capacity = 10000000; 
Windows.Storage.Streams.Buffer buffer = new Windows.Storage.Streams.Buffer(capacity); 

if (file != null) 
{ 
    CachedFileManager.DeferUpdates(file); 

    while (true) 
    { 
     await inputStream.ReadAsync(buffer, capacity, InputStreamOptions.None); 

     if (buffer.Length > 0) 
     { 
      await FileIO.WriteBufferAsync(file, buffer); 
     } 
     else 
     { 
      break; 
     } 
    } 

    FileUpdateStatus updateStatus = await CachedFileManager.CompleteUpdatesAsync(file); 
} 
+0

您应该检查ReadAsync方法的返回值,而不是检查buffer.Length。 –

回答

0

我刚才解决了这个问题。在接收代码中,我使用等待FileIO.WriteBufferAsync(文件,缓冲区);将缓冲区写入文件。此方法不能将缓冲区追加到文件。所以我使用OutputStream.WriteAsync()来处理它。