FWSocket

De BIS Wiki
Ir para navegação Ir para pesquisar

O FWSocket é um serviço que abstrai a conexão entre dois pontos distintos através de uma conexão TCP para transferência de objetos entre sistemas. A vantagem entre outras opções já oferecidas pelas plataformas, como o servidor de aplicação, é que são apenas classes do Java e não precisam de bibliotecas externas. Assim, trata-se um sistema simples para ser anexado em projetos pequenos e portáteis, como utilitários ou para dispositivos móveis.

Synchronous Connection - "Request/Response"

Uma das maneiras de se estabelecer uma comunicação entre dois pontos é o modo síncrono. Neste modo o cliente abre uma conexão com o servidor, transfere os dados (como uma requisição) e aguarda pela resposta que virá em seguida. Este modo de funcionamento é similar ao funcionamento de um servidor HTTP.

Para criar esse ambiente basta seguir os seguintes passos:

  • Do lado servidor, crie uma instância da classe FWSocketSyncServer - para criar esta classe são exigidos dois parâmetros, o primeiro é a porta em que o sistema aceitará conexões, o segundo é um listener que será chamado sempre que recebermos algum novo objeto através da conexão. Com a instância criada, chame o método startServer(). Provavelmente esta instância deverá ser controlada por um Singleton o outro pattern que permita que o objeto esteja disponível para toda aplicação e não apenas para a Thread corrente. Uma das razões para isso é que uma vez iniciado o servidor, a thread é liberada e as conexões serão escutadas em uma Thread a parte.
  • Do lado cliente, crie uma instância (ou várias a medida que forem necessárias) da classe FWSocketSyncClient - já para instanciar esta classe os argumentos necessários são: host e porta para conectar no FWSocketServer. Criada a instância, basta usar o método sendData(). Este método cria a conexão toda vez que é chamado, envia os dados e aguarda que o retorno venha do servidor.

Asynchronous Connection - "Active Full-Duplex"

Esta conexão é utilizada quando queremos estabelecer um canal de comunicação que pode ser iniciado por ambos os pontos (cliente ou servidor). Como por exemplo uma conexão de chat, em que o usuário pode envier mensagens quando quiser, e o servidor deve ter a capacidade de enviar as mensagens assim que precisa.

Embora ainda tenhamos um lado Servidor - que mantém uma porta aberta para conexão - e outro Cliente - que inicia a conexão, ao contrário do método Synchronous a conexão deste método ficará aberta o tempo todo. Não será criada apenas quando tivermos dados a serem enviados. Ambas as classes enviam dados, mas não esperam resposta na hora. A resposta virá "em outro canal" e será avisada pelo Listener.

Para estabelecer essa conexão entre dois pontos basta seguir os seguintes passos:

  1. Do lado servidor, crie uma instância do FWSocketAsync e chame o método startServer(). Neste método será obrigatório passar dois parâmetros "port" que é o número da porta que o servidor passará a escutar para conexões, e "listener" que será o listener de eventos, chamado sempre que recebermos algum dado. Para encerrar o servidor basta chamar o método stopServer().
  2. Do lado cliente, cria uma instância do FWSocketAsync, exatamente como no lado servidor, no entanto devemos chamar o método connect(). Esse método recebe 3 parametros: host - endereço do servidor, port - porta na qual o server está escutando, e listener - listener que será chamado quando recebermos dados do servidor.

Transmissão de Objetos

O conteúdo a ser transmitido deve ser colocado em uma instância do FWSocketObjectMap. Este objeto é tem a função de ser um container para os dados a serem transmitidos. Baseado em uma estrutura "Map", permite que diversos objetos sejam colocados dentro e identificados com uma chave. Como os objetos são transmitidos através da serialização do Java, obrigatoriamente o objetos a serem transmitidos devem implementar "java.io.Serializable".

Assim como para o funcionamento correto da desserialização todas as classes com mesma versão devem estar disponível do outro lado da conexão.

Propagação de Exceptions

Como as exceptions são serializáveis, caso alguma exceção ocorra durante o processamento do FWSocket, ou a chamada do listener permita que a exceção suba até o FWSocket, essa exceção será capturada e retornada para o outro lado da conexão.

  • No caso de conexão síncrona - a exceção será lançada exatamente como era e poderá ser tratada como se não tivesse passado pelo FWSocket.
  • No caso de conexão assíncrona - a conexão assíncrona não propaga exceptions. Qualquer exception será ignorada e não propagada.


Transporte da Exceção
Para transportar a exceção o BIS a serializa e envia na estrutura Map na propriedade descrita na constante FWSocketObjectMap.PROPERTY_EXCEPTION.