# BidirectionalStream


```
public abstract class BidirectionalStream
```

<br />

*** ** * ** ***

Class for bidirectional sending and receiving of data over HTTP/2 or QUIC connections. Created by `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Builder`.

Note: There are ordering restrictions on methods of `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream`; please see individual methods for description of restrictions.

## Summary

| ### Nested types |
|---|
| `public abstract class https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Builder` Builder for `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream`s. |
| `public abstract class https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback` Callback class used to receive callbacks from a `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream`. |

| ### Public constructors |
|---|
| `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#BidirectionalStream()()` |

| ### Public methods |
|---|---|
| `abstract void` | `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#cancel()()` Cancels the stream. |
| `abstract void` | `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#flush()()` Flushes pending writes. |
| `abstract boolean` | `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#isDone()()` Returns `true` if the stream was successfully started and is now done (succeeded, canceled, or failed). |
| `abstract void` | `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#read(java.nio.ByteBuffer)(https://developer.android.com/reference/java/nio/ByteBuffer.html buffer)` Reads data from the stream into the provided buffer. |
| `abstract void` | `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#start()()` Starts the stream, all callbacks go to the `callback` argument passed to `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Builder`'s constructor. |
| `abstract void` | `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#write(java.nio.ByteBuffer,boolean)(https://developer.android.com/reference/java/nio/ByteBuffer.html buffer, boolean endOfStream)` Adds data to be written to the stream. |

## Public constructors

### BidirectionalStream

```
public BidirectionalStream()
```

## Public methods

### cancel

```
public abstract void cancel()
```

Cancels the stream. Can be called at any time after `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#start()`. `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onCanceled(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo)` will be invoked when cancelation is complete and no further callback methods will be invoked. If the stream has completed or has not started, calling `cancel()` has no effect and `onCanceled()` will not be invoked. If the `https://developer.android.com/reference/java/util/concurrent/Executor.html` passed in during `BidirectionalStream` construction runs tasks on a single thread, and `cancel()` is called on that thread, no listener methods (besides `onCanceled()`) will be invoked after `cancel()` is called. Otherwise, at most one callback method may be invoked after `cancel()` has completed.

### flush

```
public abstract void flush()
```

Flushes pending writes. This method should not be invoked before `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onStreamReady(org.chromium.net.BidirectionalStream)`. For previously delayed `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#write(java.nio.ByteBuffer,boolean)`s, a corresponding `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onWriteCompleted(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,java.nio.ByteBuffer,boolean)` will be invoked when the buffer is sent.

### isDone

```
public abstract boolean isDone()
```

Returns `true` if the stream was successfully started and is now done (succeeded, canceled, or failed).

| Returns |
|---|---|
| `boolean` | `true` if the stream was successfully started and is now done (completed, canceled, or failed), otherwise returns `false` to indicate stream is not yet started or is in progress. |

### read

```
public abstract void read(ByteBuffer buffer)
```

Reads data from the stream into the provided buffer. Can only be called at most once in response to each invocation of the `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onStreamReady(org.chromium.net.BidirectionalStream)`/ `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onResponseHeadersReceived(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo)` and `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onReadCompleted(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,java.nio.ByteBuffer,boolean)` methods of the `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback`. Each call will result in an invocation of one of the `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback`'s `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onReadCompleted(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,java.nio.ByteBuffer,boolean)` method if data is read, or its `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onFailed(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,org.chromium.net.CronetException)` method if there's an error. An attempt to read data into `buffer` starting at `buffer.position()` is begun. At most `buffer.remaining()` bytes are read. `buffer.position()` is updated upon invocation of `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onReadCompleted(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,java.nio.ByteBuffer,boolean)` to indicate how much data was read.

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/nio/ByteBuffer.html buffer` | the `https://developer.android.com/reference/java/nio/ByteBuffer.html` to read data into. Must be a direct ByteBuffer. The embedder must not read or modify buffer's position, limit, or data between its position and limit until `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onReadCompleted(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,java.nio.ByteBuffer,boolean)`, `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onCanceled(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo)`, or `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onFailed(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,org.chromium.net.CronetException)` are invoked. |

### start

```
public abstract void start()
```

Starts the stream, all callbacks go to the `callback` argument passed to `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Builder`'s constructor. Should only be called once.

### write

```
public abstract void write(ByteBuffer buffer, boolean endOfStream)
```

Adds data to be written to the stream. Data will be sent only after `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream#flush()` is called. Each call will result in an invocation of one of the `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback`'s `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onWriteCompleted(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,java.nio.ByteBuffer,boolean)` method if data is sent, or its `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onFailed(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,org.chromium.net.CronetException)` method if there's an error.

An attempt to write data from `buffer` starting at `buffer.position()` is begun. `buffer.remaining()` bytes will be written. `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onWriteCompleted(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,java.nio.ByteBuffer,boolean)` will be invoked only when the full ByteBuffer is written.

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/nio/ByteBuffer.html buffer` | the `https://developer.android.com/reference/java/nio/ByteBuffer.html` to write data from. Must be a direct ByteBuffer. The embedder must not read or modify buffer's position, limit, or data between its position and limit until `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onWriteCompleted(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,java.nio.ByteBuffer,boolean)`, `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onCanceled(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo)`, or `https://developer.android.com/develop/connectivity/cronet/reference/org/chromium/net/BidirectionalStream.Callback#onFailed(org.chromium.net.BidirectionalStream,org.chromium.net.UrlResponseInfo,org.chromium.net.CronetException)` are invoked. Can be empty when `endOfStream` is `true`. |
| `boolean endOfStream` | if `true`, then `buffer` is the last buffer to be written, and once written, stream is closed from the client side, resulting in half-closed stream or a fully closed stream if the remote side has already closed. |