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
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 ClassesModifier and TypeClassDescriptionstatic interfaceDefine a component to receive data flushed from this streamstatic interfaceDefine a way to detect the status of a write -
Constructor Summary
ConstructorsConstructorDescriptionMessageOutputStream(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 TypeMethodDescriptionvoidclose()This does a flush, and BLOCKS until the CLOSE packet is acked.voidnonblocking close - Only for use inside package(package private) voiddestroy()voidflush()Flush the data already queued up, blocking only if the outbound window is full.(package private) voidcalled whenever the engine wants to push more data to the peer(package private) voidflushAvailable(MessageOutputStream.DataReceiver target, boolean blocking) booleanintvoidsetBufferSize(int size) Caller should enforce a sane minimum.voidsetWriteTimeout(int ms) (package private) voidvoidwrite(byte[] b) voidwrite(byte[] b, int off, int len) voidwrite(int b) Methods inherited from class java.io.OutputStream
nullOutputStream
-
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:
writein classOutputStream- Throws:
IOException
-
write
- Overrides:
writein classOutputStream- Throws:
IOException
-
write
- Specified by:
writein 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:
flushin interfaceFlushable- Overrides:
flushin classOutputStream- Throws:
IOException- if the write fails
-
close
This does a flush, and BLOCKS until the CLOSE packet is acked.- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Overrides:
closein 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()
-