# Class BidiStream&lt;RequestT,ResponseT&gt; (2.81.0)

2.81.0 (latest) 2.80.0 2.79.0 2.76.0 2.75.0 2.74.1 2.73.1 2.72.2 2.71.0 2.70.3 2.69.0 2.68.2 2.67.0 2.66.0 2.65.0 2.63.1 2.62.0 2.61.0 2.60.0 2.59.1 2.58.0 2.57.0 2.55.0 2.54.1 2.53.0 2.52.0 2.51.0 2.50.0 2.49.0 2.48.1 2.47.0 2.46.1 2.45.0 2.43.0 2.42.0 2.41.0 2.39.0 2.38.0 2.37.0 2.36.0 2.35.0 2.34.1 2.33.0 2.32.1 2.31.1 2.30.1 2.24.0 2.23.3 2.22.0 2.21.0 2.20.1 2.19.6 2.18.7 2.17.0 2.16.0 2.15.0 2.14.0 2.13.0 2.12.2 2.11.0 2.10.0 2.9.0 2.8.1 2.7.1

    public class BidiStream<RequestT,ResponseT> extends ServerStream<ResponseT> implements ClientStream<RequestT>

A wrapper around a bidirectional stream.

This class asynchronously pulls responses from upstream via [StreamController#request(int)](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.StreamController#com_google_api_gax_rpc_StreamController_request_int_) and exposes them via its Iterator. The implementation is back
pressure aware and uses a constant buffer of 1 item.

Please note that the stream can only be consumed once and must either be fully consumed or be
canceled.

This class can also be used to send requests to the server using [#send(Object)](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.BidiStream#com_google_api_gax_rpc_BidiStream_send_).

Neither this class nor the iterator it returns is thread-safe.

In the example below, we iterate through responses from the server and echo back the items we
see:


     BidiStream<Item> stream = ...;

     for (Item item : stream) {
       System.out.println(item.id());

       stream.send(item.id());

       // Allow for early termination
       if (item.id().equals("needle")) {
         // Cancelling the stream will cause `hasNext()` to return false on the next iteration,
         // naturally breaking the loop.
         stream.cancel();
       }
     }
     
## Inheritance

[java.lang.Object](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html) \> [ServerStream](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.ServerStream) \> BidiStream\<RequestT,ResponseT\>

## Implements

com.google.api.gax.rpc.ClientStream\<RequestT\>

## Inherited Members

[ServerStream.cancel()](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.ServerStream#com_google_api_gax_rpc_ServerStream_cancel__) [ServerStream.isReceiveReady()](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.ServerStream#com_google_api_gax_rpc_ServerStream_isReceiveReady__) [ServerStream.iterator()](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.ServerStream#com_google_api_gax_rpc_ServerStream_iterator__) [ServerStream.stream()](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.ServerStream#com_google_api_gax_rpc_ServerStream_stream__) [Object.clone()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#clone--) [Object.equals(Object)](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-) [Object.finalize()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#finalize--) [Object.getClass()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#getClass--) [Object.hashCode()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--) [Object.notify()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#notify--) [Object.notifyAll()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#notifyAll--) [Object.toString()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#toString--) [Object.wait()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait--) [Object.wait(long)](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait-long-) [Object.wait(long,int)](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait-long-int-)

| ## Type Parameters ||
|---|---|
| **Name** | **Description** |
| `RequestT` |   |
| `ResponseT` |   |

## Methods

### closeSend()

    public void closeSend()

Closes the sending side of the stream. Once called, no further calls to [#send(Object)](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.BidiStream#com_google_api_gax_rpc_BidiStream_send_),
[#closeSend()](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.BidiStream#com_google_api_gax_rpc_BidiStream_closeSend__), or [#closeSendWithError(Throwable)](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.BidiStream#com_google_api_gax_rpc_BidiStream_closeSendWithError_java_lang_Throwable_) are allowed.

Calling this method does not affect the receiving side, the iterator will continue to yield
responses from the server.

### closeSendWithError(Throwable t)

    public void closeSendWithError(Throwable t)

Closes the sending side of the stream with error. The error is propagated to the server. Once
called, no further calls to [#send(Object)](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.BidiStream#com_google_api_gax_rpc_BidiStream_send_), [#closeSend()](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.BidiStream#com_google_api_gax_rpc_BidiStream_closeSend__), or [#closeSendWithError(Throwable)](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.BidiStream#com_google_api_gax_rpc_BidiStream_closeSendWithError_java_lang_Throwable_) are allowed.

Calling this method does not affect the receiving side, the iterator will continue to yield
responses from the server.

| **Parameter** ||
|---|---|
| **Name** | **Description** |
| `t` | `https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html` |

### isSendReady()

    public boolean isSendReady()

Reports whether a message can be sent without requiring excessive buffering internally.

This method only provides a hint. It is still correct for the user to call [#send(Object)](https://docs.cloud.google.com/java/docs/reference/gax/latest/com.google.api.gax.rpc.BidiStream#com_google_api_gax_rpc_BidiStream_send_) even when this method returns `false`.

| **Returns** ||
|---|---|
| **Type** | **Description** |
| `https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html` |   |

### send(RequestT req)

    public void send(RequestT req)

Send `req` to the server.

| **Parameter** ||
|---|---|
| **Name** | **Description** |
| `req` | `RequestT` |