Можно ли установить свойства CanRead и CanWrite для объектов NetworkStream в C #? - PullRequest
2 голосов
/ 06 декабря 2011

Я хочу создать два NetworkStreams объекта и хочу, чтобы один поддерживал только операцию чтение , а другой - только запись . Это то, что я пытался сделать, но я получил ошибку

   NetworkStream nStreamObj1 = new NetworkStream(clientSocket);
   NetworkStream nStreamObj2 = new NetworkStream(clientSocket);

   nStreamObj1.canRead = true;
   nStreamObj1.canWrite = false

   nStreamObj1.canRead = false;
   nStreamObj1.canWrite = true;

Я получил ошибку, что CanRead и CanWrite - свойства только для чтения! Как я могу установить, если возможно, эти свойства?

Ответы [ 4 ]

4 голосов
/ 06 декабря 2011

Предполагая, что сокет может читать и писать, вы можете попробовать следующее:

NetworkStream nStreamObj1 = new NetworkStream(clientSocket, FileAccess.Read);
NetworkStream nStreamObj2 = new NetworkStream(clientSocket, FileAccess.Write);

Edit:

См. Раздел «Примечания» здесь

2 голосов
/ 06 декабря 2011

Если вы не можете вызвать конструктор NetworkStream (возможно, поток является результатом вызова TcpClient.GetStream), единственным вариантом будет создание потока-оболочки, переопределяющего CanRead / CanWrite свойства. Это может выглядеть примерно так:

public class ReadOrWriteStream:Stream
{
    private readonly Stream srcStream;
    private readonly bool canRead;
    private readonly bool canWrite;
    private bool disposed;

    public ReadOrWriteStream(Stream srcStream, bool canRead, bool canWrite)
    {
        this.disposed = false;
        this.srcStream = srcStream;
        this.canRead = canRead;
        this.canWrite = canWrite;
    }

    public override void Flush()
    {
        srcStream.Flush();
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        return srcStream.Seek(offset,
                              origin);
    }

    public override void SetLength(long value)
    {
        if (!CanWrite)
            throw new NotSupportedException();
        srcStream.SetLength(value);
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        if(!CanRead)
            throw new NotSupportedException();
        return srcStream.Read(buffer,
                              offset,
                              count);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        if(!CanWrite)                
            throw new NotSupportedException();
        srcStream.Write(buffer,
                               offset,
                               count);

    }

    public override bool CanRead
    {
        get
        {
            return srcStream.CanRead && canRead;
        }
    }

    public override bool CanSeek
    {
        get
        {
            return srcStream.CanSeek;
        }
    }

    public override bool CanWrite
    {
        get
        {
            return srcStream.CanWrite && canWrite;
        }
    }

    public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
    {
        if(!CanRead)
            throw new NotSupportedException();
        return srcStream.BeginRead(buffer,
                                   offset,
                                   count,
                                   callback,
                                   state);
    }

    public override int EndRead(IAsyncResult asyncResult)
    {
        return srcStream.EndRead(asyncResult);
    }

    public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
    {
        if (!CanWrite)
            throw new NotSupportedException();
        return srcStream.BeginWrite(buffer,
                                    offset,
                                    count,
                                    callback,
                                    state);
    }

    public override void EndWrite(IAsyncResult asyncResult)
    {
        srcStream.EndWrite(asyncResult);
    }

    public override long Length
    {
        get
        {
            return srcStream.Length;
        }
    }

    public override long Position
    {
        get
        {
            return srcStream.Position;
        }
        set
        {
            srcStream.Position = value;
        }
    }

    protected override void Dispose(bool disposing)
    {
        if(disposing && !disposed)
        {
            srcStream.Dispose();
            disposed = true;
        }
        base.Dispose(disposing);
    }

}

Итак:

var networkStream = myTcpClient.GetStream();
var readOnlyStream = new ReadOrWriteStream(networkStream, true, false);
var writeOnlyStream = new ReadOrWriteStream(networkStream, false, true);
0 голосов
/ 06 декабря 2011

Предоставьте соответствующее перечисляемое значение FileAccess в конструкторе, чтобы установить удобочитаемость и возможность записи NetworkStream. Свойство CanRead устанавливается при инициализации NetworkStream.

Таким образом, вы не можете напрямую установить эти значения.

0 голосов
/ 06 декабря 2011

Вы не можете установить эти значения.Они будут зависеть от состояния основного сокета, из которого был создан этот сетевой поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...