Package net.i2p.client.streaming.impl
Class MessageOutputStream
java.lang.Object
java.io.OutputStream
net.i2p.client.streaming.impl.MessageOutputStream
- All Implemented Interfaces:
Closeable
,Flushable
,AutoCloseable
class MessageOutputStream extends OutputStream
A stream that we can shove data into that fires off those bytes
on flush or when the buffer is full. It also blocks according
to the data receiver's needs.
MessageOutputStream -> ConnectionDataReceiver -> Connection -> PacketQueue -> I2PSession
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
MessageOutputStream.DataReceiver
Define a component to receive data flushed from this streamstatic interface
MessageOutputStream.WriteStatus
Define a way to detect the status of a write -
Constructor Summary
Constructors Constructor Description MessageOutputStream(I2PAppContext ctx, SimpleTimer2 timer, MessageOutputStream.DataReceiver receiver, int bufSize, int initBufSize)
MessageOutputStream(I2PAppContext ctx, SimpleTimer2 timer, MessageOutputStream.DataReceiver receiver, int bufSize, int initBufSize, int passiveFlushDelay)
-
Method Summary
Modifier and Type Method Description void
close()
This does a flush, and BLOCKS until the CLOSE packet is acked.void
closeInternal()
nonblocking close - Only for use inside package(package private) void
destroy()
void
flush()
Flush the data already queued up, blocking only if the outbound window is full.(package private) void
flushAvailable(MessageOutputStream.DataReceiver target)
called whenever the engine wants to push more data to the peer(package private) void
flushAvailable(MessageOutputStream.DataReceiver target, boolean blocking)
boolean
getClosed()
int
getWriteTimeout()
void
setBufferSize(int size)
Caller should enforce a sane minimum.void
setWriteTimeout(int ms)
(package private) void
streamErrorOccurred(IOException ioe)
void
write(byte[] b)
void
write(byte[] b, int off, int len)
void
write(int b)
-
Constructor Details
-
MessageOutputStream
public MessageOutputStream(I2PAppContext ctx, SimpleTimer2 timer, MessageOutputStream.DataReceiver receiver, int bufSize, int initBufSize) -
MessageOutputStream
public MessageOutputStream(I2PAppContext ctx, SimpleTimer2 timer, MessageOutputStream.DataReceiver receiver, int bufSize, int initBufSize, int passiveFlushDelay)
-
-
Method Details
-
setWriteTimeout
public void setWriteTimeout(int ms) -
getWriteTimeout
public int getWriteTimeout() -
setBufferSize
public void setBufferSize(int size)Caller should enforce a sane minimum.- Parameters:
size
- must be greater than 0, and smaller than or equal to bufSize in constructor
-
write
- Overrides:
write
in classOutputStream
- Throws:
IOException
-
write
- Overrides:
write
in classOutputStream
- Throws:
IOException
-
write
- Specified by:
write
in classOutputStream
- Throws:
IOException
-
flush
Flush the data already queued up, blocking only if the outbound window is full. Prior to 0.8.1, this blocked until "delivered". "Delivered" meant "received an ACK from the far end", which is not the commom implementation of flush(), and really hurt the performance of i2psnark, which flush()ed frequently. Calling flush() would cause a complete window stall. As of 0.8.1, only wait for accept into the streaming output queue. This will speed up snark significantly, and allow us to flush() the initial data in I2PTunnelRunner, saving 250 ms.- Specified by:
flush
in interfaceFlushable
- Overrides:
flush
in classOutputStream
- Throws:
IOException
- if the write fails
-
close
This does a flush, and BLOCKS until the CLOSE packet is acked.- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
- Overrides:
close
in classOutputStream
- Throws:
IOException
-
closeInternal
public void closeInternal()nonblocking close - Only for use inside package -
getClosed
public boolean getClosed() -
streamErrorOccurred
-
flushAvailable
called whenever the engine wants to push more data to the peer- Throws:
IOException
-
flushAvailable
- Throws:
IOException
-
destroy
void destroy()
-