使用StreamSocket传输文件并接收错误数据(UWP)

时间:2017-04-22 03:42:26

标签: c# file sockets uwp

在我的项目中,我使用 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);
}

1 个答案:

答案 0 :(得分:0)

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