流不可写异常的可能原因是什么?

时间:2012-02-03 15:47:05

标签: c# tcp networkstream naudio audiostreamer

使用C#中的网络流在 TCP 上序列化自定义对象时,流不可写异常的可能原因是什么? 我以Packets的形式发送Mp3数据。框架由Byte [] Buffer.I使用二进制格式化程序来序列化对象。

BinaryFormatter.Serialize(的NetworkStream,分组);

Mp3在客户端播放,失真和抖动结束几秒钟然后上面提到的异常引发了。我正在使用NAudio开源库。

在进行此修改之前,我正在使用

NetworkStream.Write(Byte [] Buffer,0,EncodedSizeofMp3); 它在给出任何异常之前就成功写了

1 个答案:

答案 0 :(得分:3)

如果您要写入NetworkStream,则可以关闭流/套接字

如果您要写信NetworkStream,可能是使用FileAccess.Read

创建的

但是,如果我不得不猜测,这听起来像是在关闭流 - 这可能是这样的情况,例如,沿路线的“作家”假定它拥有流,因此过早地关闭流。必须编写和使用某种忽略Stream请求的包装器Close()是很常见的(我现在有一个在我面前,实际上,因为我正在编写一些TCP代码)

小一点;我一般建议反对BinaryFormatter通信(除了远程处理) - 最重要的是:它不是以非常友好的方式“版本”,但在大多数情况下它也往往有点冗长。

这是我目前正在使用的包装器,如果它有帮助(Reset()方法欺骗重置位置,所以调用者可以读取相对位置):

class NonClosingNonSeekableStream : Stream
{
    public NonClosingNonSeekableStream(Stream tail)
    {
        if(tail == null) throw new ArgumentNullException("tail");
        this.tail = tail;
    }

    private long position;
    private readonly Stream tail;
    public override bool CanRead
    {
        get { return tail.CanRead; }
    }
    public override bool CanWrite
    {
        get { return tail.CanWrite; }
    }
    public override bool CanSeek
    {
        get { return false; }
    }
    public override bool CanTimeout
    {
        get { return false; }
    }
    public override long Position
    {
        get { return position; }
        set { throw new NotSupportedException(); }
    }
    public override void Flush()
    {
        tail.Flush();
    }
    public override void SetLength(long value)
    {
        throw new NotSupportedException();
    }
    public override long Seek(long offset, SeekOrigin origin)
    {
        throw new NotSupportedException();
    }
    public override long Length
    {
        get { throw new NotSupportedException(); }
    }
    public override int Read(byte[] buffer, int offset, int count)
    {
        int read = tail.Read(buffer, offset, count);
        if (read > 0) position += read;
        return read;
    }
    public override void Write(byte[] buffer, int offset, int count)
    {
        tail.Write(buffer, offset, count);
        if (count > 0) position += count;
    }
    public override int ReadByte()
    {
        int result = tail.ReadByte();
        if (result >= 0) position++;
        return result;
    }
    public override void WriteByte(byte value)
    {
        tail.WriteByte(value);
        position++;
    }
    public void Reset()
    {
        position = 0;
    }
}