在我的项目中,我使用 StreamSocket 发送文件,使用 StreamSocketListener 来接收LAN中的文件。但是当我测试时,我收到的文件大小小于我发送的文件。(例如,我发送的文件大小约为100M,接收文件大小只有2-3M)
我非常困惑,这是我的代码,tks。
发送代码(文件 StorageFile ,item是我的自定义类)
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 :(得分:0)
我刚刚解决了这个问题。在接收代码中,我使用等待FileIO.WriteBufferAsync(文件,缓冲区); 将缓冲区写入文件。此方法无法将缓冲区附加到文件。所以我使用 OutputStream.WriteAsync()来处理它。