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
All Methods Instance Methods Concrete Methods 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)
-
Methods inherited from class java.io.OutputStream
nullOutputStream
-
-
-
-
Constructor Detail
-
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 Detail
-
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
public void write(byte[] b) throws IOException
- Overrides:
write
in classOutputStream
- Throws:
IOException
-
write
public void write(byte[] b, int off, int len) throws IOException
- Overrides:
write
in classOutputStream
- Throws:
IOException
-
write
public void write(int b) throws IOException
- Specified by:
write
in classOutputStream
- Throws:
IOException
-
flush
public void flush() throws IOException
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
public void close() throws IOException
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
void streamErrorOccurred(IOException ioe)
-
flushAvailable
void flushAvailable(MessageOutputStream.DataReceiver target) throws IOException
called whenever the engine wants to push more data to the peer- Throws:
IOException
-
flushAvailable
void flushAvailable(MessageOutputStream.DataReceiver target, boolean blocking) throws IOException
- Throws:
IOException
-
destroy
void destroy()
-
-