#if !NETFX_CORE using System; using System.IO; using System.Net.Sockets; using System.Threading.Tasks; namespace Plane.Communication { /// /// 提供 TCP 通信的部分实现。 /// public abstract class TcpConnectionBase : ExceptionThrownEventSource, IConnection { protected TcpClient _client; protected bool _isBroken; protected Stream _stream; public int Available { get { try { return _client.Available; } catch (ObjectDisposedException ex) { RaiseExceptionThrown(ex); return 0; } } } public bool IsOpen { get { try { return !_isBroken && _client.Connected; } catch (ObjectDisposedException) { return false; } } } public void Close() { _stream.Close(); _client.Close(); } public abstract Task OpenAsync(); public int BytesToRead() { return 0; } public int Read(byte[] buffer, int offset, int count) { try { return _stream.Read(buffer, offset, count); } catch (ArgumentOutOfRangeException ex) { RaiseExceptionThrown(ex); return 0; } catch (Exception ex) // 常见的是 IOException。 { _isBroken = true; RaiseExceptionThrown(ex); return 0; } } public async Task ReadAsync(byte[] buffer, int offset, int count) { try { while (Available < count) { await Task.Delay(5).ConfigureAwait(false); } return await _stream.ReadAsync(buffer, offset, count); } catch (Exception ex) { _isBroken = true; RaiseExceptionThrown(ex); return 0; } } public void Write(byte[] buffer, int offset, int count) { try { _stream.Write(buffer, offset, count); } catch (ArgumentOutOfRangeException ex) { RaiseExceptionThrown(ex); } catch (Exception ex) { _isBroken = true; RaiseExceptionThrown(ex); } } public async Task WriteAsync(byte[] buffer, int offset, int count) { try { await _stream.WriteAsync(buffer, offset, count); } catch (Exception ex) { _isBroken = true; RaiseExceptionThrown(ex); } } } } #endif