## Package net.i2p.client

Implements the base I2P SDK for developing applications that communicate through I2P.

See:
Description

Interface Summary
I2CPMessageHandler: Define a way to handle a particular type of message
I2PClient: Define the standard means of interacting with the I2P system
I2PSession: Define the standard means of sending and receiving messages on the I2P network by using the I2CP (the client protocol).
I2PSessionListener: Define a means for the router to asynchronously notify the client that a new message is available or the router is under attack.

Class Summary
ATalk: ATalk - anonymous talk, demonstrating a trivial I2P usage scenario.
DisconnectMessageHandler: Handle I2CP disconnect messages from the router
HandlerImpl: Base class for handling I2CP messages
I2CPMessageProducer: Produce the various messages the session needs to send to the router.
I2PClientFactory: Provide a means of hooking into an appropriate I2PClient implementation
I2PClientImpl: Base client implementation
I2PClientMessageHandlerMap: Contains a map of message handlers that a session will want to use
I2PSessionImpl: Implementation of an I2P session running over TCP.
I2PSessionImpl2: Thread safe implementation of an I2P session running over TCP.
MessagePayloadMessageHandler: Handle I2CP MessagePayloadMessages from the router delivering the contents of a message by accepting it, decrypting the payload, adding it to the set of recieved messages, and telling the router that it has been recieved correctly.
MessageState: Contains the state of a payload message being sent to a peer
MessageStatusMessageHandler: Handle I2CP MessageStatusMessages from the router.
RequestLeaseSetMessageHandler: Handle I2CP RequestLeaseSetMessage from the router by granting all leases
SessionStatusMessageHandler: Handle I2CP SessionStatusMessagese from the router, updating the session as necssary.
SetDateMessageHandler: Handle I2CP time messages from the router

Exception Summary
I2PSessionException: Thrown when there is a problem doing something on the session

## Package net.i2p.client Description

Implements the base I2P SDK for developing applications that communicate through I2P.

When a client application wants to communicate over I2P, the first thing it needs to do is get a `I2PClient` from the `I2PClientFactory`. If it does not already have a `Destination`, it must generate one with the `I2PClient.createDestination(java.io.OutputStream)` before proceeding. Once it has one, it then creates an `I2PSession` which serves as the bridge to the I2P network, allowing it to send messages (via `I2PSession.sendMessage(net.i2p.data.Destination, byte[])`) and receive messages (via `I2PSession.receiveMessage(int)`). In addition, the client receives asynchronous notification of network activity by providing an implementation of `I2PSessionListener`.

A simple example of how these base client classes can be used is the `ATalk` application. It isn't really useful, but it is heavily documented code.

This client package provides the basic necessity for communicating over I2P, but there are three other subpackages that are helpful. Specifically:

- `net.i2p.client.datagram` - for applications that want their messages to be both authenticated and repliable
- `net.i2p.client.naming` - for applications that want to resolve readable names into `Destination`s
- `net.i2p.client.streaming` - for applications that want to use a streaming API to provide reliable in order message delivery (note: the streaming library is packaged seperate from the main SDK - in the mstreaming.jar and streaming.jar)

The `I2PSession` implementation itself communicates with the I2P router by the I2CP (the client protocol).