Live Sequence Protocol for Java
Implementation of LSP in Java language
 Todos Classes Namespaces Arquivos Funções Variáveis
LspClient.java
Vá para a documentação deste arquivo.
1 package lsp;
2 
3 import java.io.IOException;
4 import java.net.InetSocketAddress;
5 import java.net.SocketAddress;
6 import java.util.concurrent.TimeoutException;
7 
8 public class LspClient {
9  private final LspSocket lspSocket;
10  private final LspConnection conn;
11  private final LspParams params;
12 
13  private volatile boolean active = true;
14  private volatile boolean markClosed = false;
15 
16  public LspClient(String host, int port, LspParams params) throws IOException, TimeoutException {
17  SocketAddress sockAddr = new InetSocketAddress(host, port);
18  params = (params == null) ? LspParams.defaultParams() : params;
19 
20 
21  lspSocket = new LspSocketImpl(0);
22  try {
23  conn = lspSocket.connect(sockAddr, params, new ClientTriggers());
24  this.params = params;
25  } catch (TimeoutException e) {
26  lspSocket.close();
27  throw e;
28  }
29  }
30 
34  public short getConnId() {
35  return conn.getId();
36  }
37 
42  public byte[] read() {
43  try {
44  checkActive();
45  return lspSocket.receive().getPayload();
46  } catch (ClosedConnectionException | NullPointerException e) {
47  return null;
48  }
49  }
50 
55  public void write(byte[] payload) {
56  checkActive();
57 
58  Pack p = new Pack(conn.getId(), payload);
59  lspSocket.send(p);
60  conn.incSendMissing();
61  }
62 
66  public void close() {
67  checkActive();
68 
69  // Marca a conexão como fechada e se não há mensagens para serem
70  // enviadas, encerra realmente a conexão.
71  markClosed = true;
72  conn.close(false);
73  if (conn.getSendMissing() == 0) {
74  realClose();
75  return;
76  }
77 
78  while (!conn.isInterrupted()) {
79  try {
80  Thread.sleep(params.getEpoch());
81  } catch (InterruptedException e) {
82  realClose();
83  return;
84  }
85  }
86  }
87 
88  private void realClose() {
89  this.active = false;
90  this.conn.close();
91  this.lspSocket.close();
92  }
93 
94  private void checkActive() {
95  if (!active || markClosed)
96  throw new ClosedConnectionException();
97  }
98 
99  private final class LspSocketImpl extends LspSocket {
100  LspSocketImpl(int port) throws IOException {
101  super(port);
102  }
103 
104  @Override
105  boolean isActive() {
106  return active;
107  }
108 
109  @Override
110  LspConnection usedConnection(short connId) {
111  if (conn != null && conn.getId() == connId) {
112  return conn;
113  } else {
114  return null;
115  }
116  }
117  }
118 
119  private final class ClientTriggers implements ConnectionTriggers {
120  @Override
121  public void doEpochActions() {
122  Helpers.resendData(lspSocket, conn);
123  Helpers.resendAck(lspSocket, conn);
124  }
125 
126  @Override
127  public void doCloseConnection() {
128  realClose();
129  }
130  }
131 }
Serviço de entrada e saída de pacotes.
Definition: LspSocket.java:26
Representa uma conexão LSP.
byte[] read()
Devolve um vetor de bytes de uma mensagem enviada pelo lado servidor.
Definition: LspClient.java:42
void close()
Encerra a conexão.
Definition: LspClient.java:66
short getConnId()
Devolve o Id da conexão.
Definition: LspClient.java:34
void write(byte[] payload)
Envia uma mensagen para o lado servidor como um vetor de bytes.
Definition: LspClient.java:55
static final LspParams defaultParams()
Definition: LspParams.java:22
int getSendMissing()
Número de mensagens na fila, mas faltam enviar.
LspClient(String host, int port, LspParams params)
Definition: LspClient.java:16