Live Sequence Protocol for Java
Implementation of LSP in Java language
 Todos Classes Namespaces Arquivos Funções Variáveis
Componentes | Métodos Públicos | Atributos Estáticos Protegidos | Funções do Pacote | Funções Estáticas do Pacote | Lista de todos os Membros
Referência da Classe lsp.LspSocketabstract

Serviço de entrada e saída de pacotes. Mais...

Diagrama de Hierarquia para lsp.LspSocket:
Inheritance graph
[legenda]

Métodos Públicos

InternalPack receive ()
 Recebe um pacote da fila de entrada. Mais...
 
void send (Pack p)
 Insere um pacote na fila de saída. Mais...
 

Atributos Estáticos Protegidos

static final byte CONNECT = 0
 
static final byte DATA = 1
 
static final byte ACK = 2
 

Funções do Pacote

 LspSocket (int port, int queueSize) throws IOException
 Inicia um LspSocket. Mais...
 
 LspSocket (int port) throws IOException
 Inicia um LspSocket. Mais...
 
abstract boolean isActive ()
 Indica até quando o serviço será executado. Mais...
 
final void close ()
 
final LspConnection connect (SocketAddress sockAddr, LspParams params, ConnectionTriggers triggers) throws TimeoutException
 Tenta estabelecer conexão com um servidor LSP, reenviando solicitação a cada época, até completar o limite da época. Mais...
 
void dgramReceiveConnect (final SocketAddress sockAddr, final ByteBuffer buf)
 Tratamento de um pacote do tipo CONNECT recebido. Mais...
 
void dgramReceiveData (final SocketAddress sockAddr, final ByteBuffer buf)
 Tratamento de um pacote do tipo DATA recebido. Mais...
 
void dgramReceiveAck (final SocketAddress sockAddr, final ByteBuffer buf)
 Tratamento de um pacote do tipo ACK recebido. Mais...
 
final void dgramSendData (final LspConnection conn, final short seqNum, final byte[] payload)
 
final void dgramSendData (final InternalPack p)
 
final void dgramSendAck (final LspConnection conn, final short seqNum)
 
final void dgramSendAck (final InternalPack p)
 
abstract LspConnection usedConnection (short connId)
 Obtém o objeto LspConnection em uso. Mais...
 
int getPort ()
 

Funções Estáticas do Pacote

static final byte[] payload (final ByteBuffer buf)
 Helper para obter um array de bytes com o resto do ByteBuffer. Mais...
 

Descrição Detalhada

Serviço de entrada e saída de pacotes.

Classe abstrata.

Autor
Wagner Macedo

Definição na linha 26 do arquivo LspSocket.java.

Construtores & Destrutores

lsp.LspSocket.LspSocket ( int  port,
int  queueSize 
) throws IOException
package

Inicia um LspSocket.

Parâmetros
portPorta onde o socket estará vinculado
queueSizeTamanho inicial das filas de entrada e saída
Exceções
SocketException

Definição na linha 66 do arquivo LspSocket.java.

66  {
67  // Cria o socket e as filas
68  this.socket = new DatagramSocket(port);
69  this.port = this.socket.getLocalPort();
70  this.inputQueue = new LinkedBlockingQueue<>(queueSize);
71  this.outputQueue = new LinkedBlockingDeque<>(queueSize);
72 
73  // Inicializa thread de entradas
74  this.inputThread = new Thread(new InputTask());
75  this.inputThread.setDaemon(true);
76  this.inputThread.start();
77 
78  // Inicializa thread de saídas
79  this.outputThread = new Thread(new OutputTask());
80  this.outputThread.setDaemon(true);
81  this.outputThread.start();
82  }
lsp.LspSocket.LspSocket ( int  port) throws IOException
package

Inicia um LspSocket.

Parâmetros
portPorta onde o socket estará vinculado
Exceções
SocketException

Definição na linha 90 do arquivo LspSocket.java.

90  {
91  this(port, QUEUE_ZISE);
92  }

Métodos

final void lsp.LspSocket.close ( )
package

Definição na linha 102 do arquivo LspSocket.java.

102  {
103  socket.close();
104 
105  // Para todas as threads
106  inputThread.interrupt();
107  outputThread.interrupt();
108 
109  // Limpeza de memória
110  inputQueue.clear();
111  outputQueue.clear();
112  }
final LspConnection lsp.LspSocket.connect ( SocketAddress  sockAddr,
LspParams  params,
ConnectionTriggers  triggers 
) throws TimeoutException
package

Tenta estabelecer conexão com um servidor LSP, reenviando solicitação a cada época, até completar o limite da época.

Definição na linha 118 do arquivo LspSocket.java.

118  {
119  // Novo processo de conexão
120  final ConnectTask task = new ConnectTask(sockAddr, params);
121 
122  try {
123  while (isActive()) {
124  synchronized (connectLock) {
125  // Se não há um processo de conexão em curso, registra um
126  if (this.connectTask == null) {
127  this.connectTask = task;
128  }
129 
130  // Havendo um processo de conexão em curso, aguarda uma
131  // época e tenta se conectar novamente
132  else {
133  Thread.sleep(params.getEpoch());
134  continue;
135  }
136  }
137 
138  // Executa o processo de conexão
139  final ExecutorService exec = Executors.newSingleThreadExecutor();
140  final Future<Short> id = exec.submit(task);
141 
142  // Se o processo concluir corretamente, uma nova conexão será gerada
143  try {
144  final short connId = id.get();
145  return new LspConnection(connId, sockAddr, params, triggers);
146  }
147 
148  // Se uma exceção foi lançada, então relança-a contextualmente
149  catch (ExecutionException e) {
150  if (e.getCause() instanceof TimeoutException) {
151  throw (TimeoutException) e.getCause().fillInStackTrace();
152  } else {
153  throw new RuntimeException(e);
154  }
155  }
156 
157  // Garante a liberação da thread de requisição de conexão e
158  // registra que o processo de conexão se encerrou
159  finally {
160  exec.shutdown();
161  this.connectTask = null;
162  }
163  }
164  } catch (InterruptedException e) {}
165 
166  return null;
167  }
abstract boolean isActive()
Indica até quando o serviço será executado.

Este é o diagrama das funções utilizadas por esta função:

void lsp.LspSocket.dgramReceiveAck ( final SocketAddress  sockAddr,
final ByteBuffer  buf 
)
package

Tratamento de um pacote do tipo ACK recebido.

Definição na linha 228 do arquivo LspSocket.java.

228  {
229  final short connId = buf.getShort();
230  final LspConnection conn = usedConnection(sockAddr, connId);
231 
232  // Se o connId é válido, reconhece a mensagem
233  if (conn != null) {
234  final short seqNum = buf.getShort();
235  conn.ack(seqNum);
236  }
237 
238  // Senão verifica se há uma tentativa de conexão em curso. Caso
239  // positivo, verifica também se id não é 0, número de sequência é 0,
240  // conferindo antes se o ACK vem do socket remoto correto
241  else {
242  final ConnectTask task = connectTask;
243  if (task != null && connId > 0 && buf.getShort() == 0
244  && sockAddr.equals(task.sockAddr)) {
245  task.ack(connId);
246  }
247  }
248  }
abstract LspConnection usedConnection(short connId)
Obtém o objeto LspConnection em uso.

Este é o diagrama das funções utilizadas por esta função:

void lsp.LspSocket.dgramReceiveConnect ( final SocketAddress  sockAddr,
final ByteBuffer  buf 
)
package

Tratamento de um pacote do tipo CONNECT recebido.

Esse método deve ser sobrescrito pelo servidor

Definição na linha 199 do arquivo LspSocket.java.

199  {
200  }
void lsp.LspSocket.dgramReceiveData ( final SocketAddress  sockAddr,
final ByteBuffer  buf 
)
package

Tratamento de um pacote do tipo DATA recebido.

Definição na linha 203 do arquivo LspSocket.java.

203  {
204  LspConnection conn = usedConnection(sockAddr, buf.getShort());
205 
206  // Só continua se a conexão é válida e não estiver fechada
207  if (conn != null && !conn.isClosed()) {
208  short seqNum = buf.getShort();
209  byte[] payload = payload(buf);
210  InternalPack pack = new InternalPack(conn, seqNum, payload);
211 
212  // Se a mensagem foi enfileirada, envia o ACK e informa o número
213  // de sequência à conexão (usado nos disparos da época).
214  if (inputQueue.offer(pack)) {
215  dgramSendAck(pack);
216  conn.received(seqNum);
217  }
218 
219  // Caso contrário, mesmo que a mensagem não possa ser lida,
220  // atualiza o momento da última mensagem recebida
221  else {
222  conn.received();
223  }
224  }
225  }
static final byte[] payload(final ByteBuffer buf)
Helper para obter um array de bytes com o resto do ByteBuffer.
Definition: LspSocket.java:292
abstract LspConnection usedConnection(short connId)
Obtém o objeto LspConnection em uso.
final void dgramSendAck(final LspConnection conn, final short seqNum)
Definition: LspSocket.java:283

Este é o diagrama das funções utilizadas por esta função:

final void lsp.LspSocket.dgramSendAck ( final LspConnection  conn,
final short  seqNum 
)
package

Definição na linha 283 do arquivo LspSocket.java.

283  {
284  dgramSend(ACK, conn, seqNum, PAYLOAD_NIL);
285  }
static final byte ACK
Definition: LspSocket.java:29

Este é o diagrama das funções que utilizam esta função:

final void lsp.LspSocket.dgramSendAck ( final InternalPack  p)
package

Definição na linha 287 do arquivo LspSocket.java.

287  {
288  dgramSendAck(p.getConnection(), p.getSeqNum());
289  }
final void dgramSendAck(final LspConnection conn, final short seqNum)
Definition: LspSocket.java:283

Este é o diagrama das funções utilizadas por esta função:

final void lsp.LspSocket.dgramSendData ( final LspConnection  conn,
final short  seqNum,
final byte[]  payload 
)
package

Definição na linha 271 do arquivo LspSocket.java.

271  {
272  if (payload.length > LEN_PAYLOAD) {
273  throw new IllegalArgumentException("Payload não pode ser maior que " + LEN_PAYLOAD);
274  }
275 
276  dgramSend(DATA, conn, seqNum, payload);
277  }
static final byte DATA
Definition: LspSocket.java:28
static final byte[] payload(final ByteBuffer buf)
Helper para obter um array de bytes com o resto do ByteBuffer.
Definition: LspSocket.java:292

Este é o diagrama das funções que utilizam esta função:

final void lsp.LspSocket.dgramSendData ( final InternalPack  p)
package

Definição na linha 279 do arquivo LspSocket.java.

279  {
280  dgramSendData(p.getConnection(), p.getSeqNum(), p.getPayload());
281  }
final void dgramSendData(final LspConnection conn, final short seqNum, final byte[] payload)
Definition: LspSocket.java:271

Este é o diagrama das funções utilizadas por esta função:

int lsp.LspSocket.getPort ( )
package

Definição na linha 349 do arquivo LspSocket.java.

349  {
350  return this.port;
351  }
abstract boolean lsp.LspSocket.isActive ( )
packagepure virtual

Indica até quando o serviço será executado.

Esse método deve ser implementado em uma subclasse.

Retorna
false para parar o serviço

Este é o diagrama das funções que utilizam esta função:

static final byte [] lsp.LspSocket.payload ( final ByteBuffer  buf)
staticpackage

Helper para obter um array de bytes com o resto do ByteBuffer.

Definição na linha 292 do arquivo LspSocket.java.

292  {
293  byte[] bs = new byte[buf.remaining()];
294  for (int i = 0; i < bs.length; i++) {
295  bs[i] = buf.get();
296  }
297 
298  return bs;
299  }

Este é o diagrama das funções que utilizam esta função:

InternalPack lsp.LspSocket.receive ( )

Recebe um pacote da fila de entrada.

Definição na linha 323 do arquivo LspSocket.java.

323  {
324  while (isActive()) {
325  try {
326  InternalPack nextPack = inputQueue.poll(1, TimeUnit.SECONDS);
327  if (nextPack != null) {
328  return nextPack;
329  }
330  } catch (InterruptedException e) {
331  break;
332  }
333  }
334 
335  return null;
336  }
abstract boolean isActive()
Indica até quando o serviço será executado.

Este é o diagrama das funções utilizadas por esta função:

void lsp.LspSocket.send ( Pack  p)

Insere um pacote na fila de saída.

Definição na linha 339 do arquivo LspSocket.java.

339  {
340  if (p.getPayload().length > LEN_PAYLOAD) {
341  throw new IllegalArgumentException("Payload não pode ser maior que " + LEN_PAYLOAD);
342  }
343 
344  if (!outputQueue.offer(p)) {
345  throw new IllegalStateException("Fila de saída cheia");
346  }
347  }

Este é o diagrama das funções utilizadas por esta função:

abstract LspConnection lsp.LspSocket.usedConnection ( short  connId)
packagepure virtual

Obtém o objeto LspConnection em uso.

Parâmetros
connIdId de conexão para validar/pesquisar
Retorna
Uma instância de LspConnection ou null

Este é o diagrama das funções que utilizam esta função:

Atributos

final byte lsp.LspSocket.ACK = 2
staticprotected

Definição na linha 29 do arquivo LspSocket.java.

final byte lsp.LspSocket.CONNECT = 0
staticprotected

Definição na linha 27 do arquivo LspSocket.java.

final byte lsp.LspSocket.DATA = 1
staticprotected

Definição na linha 28 do arquivo LspSocket.java.


A documentação para esta classe foi gerada a partir do seguinte arquivo: