## Package net.i2p.client.streaming

Implements a TCP-like (reliable, authenticated, in order) set of sockets for communicating over the IP-like (unreliable, unauthenticated, unordered) I2P messages.

See:
Description

Interface Summary
ConnectionManager.PingNotifier
I2PServerSocket: Defines how to listen for streaming peer connections
I2PSocket: Minimalistic adapter between the socket api and I2PTunnel's way.
I2PSocket.SocketErrorListener: Allow notification of underlying errors communicating across I2P without waiting for any sort of cleanup process.
I2PSocketManager: Centralize the coordination and multiplexing of the local client's streaming.
I2PSocketManager.DisconnectListener
I2PSocketOptions: Define the configuration for streaming and verifying data on the socket.
MessageOutputStream.DataReceiver: Define a component to receive data flushed from this stream
MessageOutputStream.WriteStatus: Define a way to detect the status of a write
TaskScheduler: Coordinates what we do 'next'.

Class Summary
ByteCollector: Like a StringBuffer, but for bytes.
Connection: Maintain the state controlling a streaming connection between two destinations.
ConnectionDataReceiver: Receive data from the MessageOutputStream, build a packet, and send it through a connection.
ConnectionHandler: Receive new connection attempts
ConnectionManager: Coordinate all of the connections for a single local destination.
ConnectionOptions: Define the current options for the con (and allow custom tweaking midstream)
ConnectionPacketHandler: Receive a packet for a particular connection - placing the data onto the queue, marking packets as acked, updating various fields, etc.
I2PServerSocketFull: Bridge to allow accepting new connections
I2PServerSocketImpl: Server socket implementation, allowing multiple threads to accept I2PSockets and pull from a queue populated by various threads (each of whom have their own timeout)
I2PSocketFull: Bridge between the full streaming lib and the I2PSocket API
I2PSocketImpl: Initial stub implementation for the socket
I2PSocketManagerFactory: Simplify the creation of I2PSession and transient I2P Destination objects if necessary to create a socket manager.
I2PSocketManagerFull: Centralize the coordination and multiplexing of the local client's streaming.
I2PSocketManagerImpl: Centralize the coordination and multiplexing of the local client's streaming.
I2PSocketOptionsImpl: Define the configuration for streaming and verifying data on the socket.
MessageHandler: Receive raw information from the I2PSession and turn it into Packets, if we can.
MessageInputStream: Stream that can be given messages out of order yet present them in order.
MessageOutputStream: A stream that we can shove data into that fires off those bytes on flush or when the buffer is full.
Packet: Contain a single packet transferred as part of a streaming connection.
PacketHandler: receive a packet and dispatch it correctly to the connection specified, the server socket, or queue a reply RST packet.
PacketLocal: coordinate local attributes about a packet - send time, ack time, number of retries, etc.
PacketQueue: Queue out packets to be sent through the session.
RetransmissionTimer
SchedulerChooser: Examine a connection's state and pick the right scheduler for it.
SchedulerClosed: Scheduler used for after both sides have had their close packets ACKed, but the final timeout hasn't passed.
SchedulerClosing: Scheduler used for after both SYNs have been ACKed and both sides have closed the stream, but either we haven't ACKed their close or they haven't ACKed ours.
SchedulerConnectedBulk: Scheduler used for after our SYN has been sent and ACKed but one (or more) sides haven't closed the stream yet.
SchedulerConnecting: Scheduler used once we've sent our SYN but it hasn't been ACKed yet.
SchedulerDead: Scheduler used for after the final timeout has passed or the connection was reset.
SchedulerHardDisconnected: Scheduler used after we've locally done a hard disconnect, but the final timeout hasn't passed.
SchedulerImpl: Base scheduler
SchedulerPreconnect: Scheduler used for locally created connections where we have not yet sent the initial SYN packet.
SchedulerReceived: Scheduler used after receiving an inbound connection but before we have sent our own SYN.
StreamSinkClient: Simple streaming lib test app that connects to a given destination and sends it a particular amount of random data, then disconnects.
StreamSinkSend: Simple streaming lib test app that connects to a given destination and sends the contents of a file, then disconnects.
StreamSinkServer: Listen to a destination, receiving any sockets and writing anything they send to a new file.
TestSwarm: Sit around on a destination, receiving lots of data and sending lots of data to whomever talks to us.

Exception Summary
TooManyStreamsException: We attempted to have more open streams than we are willing to put up with

## Package net.i2p.client.streaming Description

Implements a TCP-like (reliable, authenticated, in order) set of sockets for communicating over the IP-like (unreliable, unauthenticated, unordered) I2P messages.

When an application wants to use streams, it must fetch an `I2PSocketManager` from the `I2PSocketManagerFactory`, which in turn builds its own `I2PSession` internally. All communication over that `I2PSession` is handled by the `I2PSocketManager`, as it imposes its own formatting on the raw messages sent and received. If an application wants to receive streams from other clients on the network, it should access the blocking `I2PServerSocket.accept()` method, which will provide an `I2PSocket` when a new one is available. If an application wants to create a new stream to a peer, it should do so with the appropriate `I2PSocketManager.connect(net.i2p.data.Destination, net.i2p.client.streaming.I2PSocketOptions)` call.

There is a simple pair of demo applications available as well - `StreamSinkServer` listens to a destination and dumps the data from all sockets it accepts to individual files, while `StreamSinkClient` connects to a particular destination and sends a specific amount of random data then disconnects.