3 import java.net.InetSocketAddress;
4 import java.net.SocketAddress;
5 import java.util.concurrent.atomic.AtomicInteger;
13 private final short id;
14 private final long sockId;
17 private volatile boolean closed;
18 private volatile boolean markClosed;
19 private volatile short seqNum;
20 private volatile long receivedTime;
22 private final AtomicInteger sendMissing;
23 private final Object lock =
new Object();
26 private final SocketAddress sockAddr;
27 private final Thread statusThread;
42 if (sockAddr == null || params == null)
43 throw new NullPointerException(
"Nenhum parâmetro pode ser nulo");
47 this.sockAddr = sockAddr;
48 this.triggers = triggers;
51 this.receivedTime = -1;
52 this.receivedSeqNum = -1;
53 this.sendMissing =
new AtomicInteger(0);
55 this.statusThread =
new Thread(
new StatusChecker(params));
56 this.statusThread.setDaemon(
true);
57 this.statusThread.start();
71 this(id,
uniqueSockId(sockAddr), sockAddr, params, triggers);
84 final InetSocketAddress addr = (InetSocketAddress) sockAddr;
85 final int ip = addr.getAddress().hashCode();
86 final int port = addr.getPort();
87 return (ip & 0xffff_ffffL) << 16 | (short) port;
100 return this.sockAddr;
108 this.sendMissing.incrementAndGet();
116 return this.sendMissing.intValue();
121 return this.sentMessage;
131 synchronized (lock) {
133 if (this.sentMessage == null) {
134 this.sentMessage = p;
147 synchronized (lock) {
149 if (this.seqNum == seqNum) {
150 this.sentMessage = null;
154 this.sendMissing.decrementAndGet();
173 this.receivedTime = System.currentTimeMillis();
184 this.receivedSeqNum = seqNum;
192 return this.closed || this.markClosed;
201 this.statusThread.interrupt();
204 this.markClosed =
true;
212 private final class StatusChecker
implements Runnable {
215 private StatusChecker(
LspParams params) {
216 this.params = params;
222 long lastTime = receivedTime;
225 int limit = params.getEpochLimit();
226 final int epoch = params.getEpoch();
230 while (!closed && limit-- > 0) {
233 if (markClosed && sendMissing.get() <= 0) {
239 }
catch (InterruptedException e) {
244 triggers.doEpochActions();
248 final long time = receivedTime;
249 if (time != lastTime) {
251 limit = params.getEpochLimit();
256 triggers.doCloseConnection();
InternalPack sent(Pack pack)
Informa o payload da última mensagem enviada.
LspConnection(short id, long sockId, SocketAddress sockAddr, LspParams params, ConnectionTriggers triggers)
Constrói um objeto LspConnection.
static long uniqueSockId(SocketAddress sockAddr)
Número único gerado a partir de um endereço IP e uma porta.
Representa uma conexão LSP.
void ack(short seqNum)
Informa que o ACK do número de sequência informado foi recebido.
SocketAddress getSockAddr()
InternalPack sent()
Obtém a última mensagem de dados enviada (aguardando ACK)
long getSockId()
Número único gerado a partir de um endereço IP e uma porta.
void received(short seqNum)
Informa o número de sequência em que uma mensagem DATA foi recebida.
void incSendMissing()
Aumenta em um o número de mensagens na fila, mas faltam enviar.
void received()
Informa que houve uma mensagem recebida por essa conexão.
int getSendMissing()
Número de mensagens na fila, mas faltam enviar.
LspConnection(short id, SocketAddress sockAddr, LspParams params, ConnectionTriggers triggers)
Constrói um objeto LspConnection.
short receivedSeqNum()
Número de sequência da última mensagem DATA recebida por essa conexão.
void close(boolean interrupt)