Free YouTube Transcribe

Video transcript

6) Fazedor de Continhas: implementação das classes específicas do Servidor (parte 2)

André Luís dos Reis Gomes de Carvalho · 6,466 words · 30 min read

WhatsAppTelegramX

Want to search this transcript, jump the video from any line, or download it as TXT, SRT, or VTT?

Open in the transcript tool

Full transcript

0:01Olá pessoal Esse é o último vídeo da série que aborda o servidor de continhas o nosso sistema cliente servidor o fazedor de conhas e nesse vídeo eu quero mostrar para vocês a implementação das classes que são específicas do Servidor vamos dar uma olhada aqui nas

0:26nossas nas nossas ações que a gente tinha elencado e comentado no vídeo anterior e encontrar onde elas estão lá na implementação então Aqui tá dizendo que eu tenho que checar os parâmetros vindos para m no vetor args para permitir que o usuário indique a porta

0:47que quer que o servidor adote e eventuais erros vão ser sinalizados E no caso do usuário que é o usuário administrador hein não indica nada não vem nenhum parâmetro para ming args então uma porta padrão deve ser adotada para aceitar conexões

1:09dos clientes vamos ver onde que isso tá acontecendo lá na Main observem que logo no começo da Main eu já verifico se a quantidade de parâmetros presentes no vetor arges for maior do que um eu vou sinalizar um erro né é um erro que eu tô sinalizando e eu

1:33digo que o uso esperado desse programa é Java servidor opcionalmente uma porta pode ter essa porta Pode não ter esses colchetes indicam opcionalidade opcionalmente uma porta Então eu só posso ter um parâmetro ou nenhum não dá

1:53para ter mais do que um né que é o que eu estou testando aqui se eu tiver mais do que um eu se finalizo esse erro e executo o comando return que faz a Main terminar e portanto o programa inteiro terminar se eu não entrar nesse if eu vou declarar esse string chamado porta e

2:16vou fazer ele receber porta padrão que foi definida aqui em cima com o valor de 3000 tá porta padrão é inicialmente Vale inicialmente 3000 aqui na verdade seria bem

2:37apropriado a gente colocar a palavrinha final para que essa essa porta padrão seja uma constante tá então nós temos aqui 3000 como sendo uma constante e ela se chama essa constante porta padrão Aí

2:58pess gente observa que aqui eu fiz porta que é uma variável que foi declarada aqui mesmo eu fiz ela valer servidor pon porta padrão sabemos que porta padrão é 3000 eh verificamos aqui se o comprimento do vetor args é exatamente um O que

3:21significa que foi fornecido um parâmetro que seria a porta né no vetor args se isso aconteceu eu vou vou eh pegar esse parâmetro que seria o a porta né que tá lá presente no vetor ar e vou substituir

3:42aqui nessa variável essa variável valia a porta padrão mas depois dessa substituição ela passou a valer aquilo que foi fornecido pelo usuário administrador como parâmetro e que estava no vetor args ou seja se houver um parâmetro ele vai ser guardado aqui

4:02se não houver eu não entro nesse if e fica a porta padrão eu ponho a porta padrão e substituo pelo que o usuário mandou se o usuário mandar né então é exatamente aqui que tá essa parte da indicação da porta que foi mencionada

4:23aqui nesse item um agora vamos pra segunda ação de iniciação Aqui tá dizendo que deve ser declarada e instanciada uma estrutura de dados que vai ser do tipo

4:43arraylist chamada usuários que é uma estrutura que vai ser usada para armazenar objetos da classe parceiro e nessa estrutura vão estar todos os acessos aos clientes conectados que são justamente os parceiros do Servidor e aqui tá dizendo que esses acessos vão ser usados ao longo do

5:04programa inteiro para se comunicar com esses clientes então agora nessa ação dois Eu precisaria declarar e instanciar usuários que vai ser um arraylist para guardar objetos da classe parceiro vamos ver isso lá no código do nosso

5:26programa declaramos aqui ó arraylist para guardar parceiro chamado usuários então a minha estrutura de dados se chama usuários e o tipo dela é um arraylist de guardar parceiro não só declarei como também

5:50agora vou instanciar fazendo igual New Array list de parceiro então aqui foi feita a declaração que a gente mencionou neste item número dois finalmente para encerrar as ações

6:10de iniciação vamos verificar onde que é a ação de iniciação de número TRS se encontra implementada ali no início da Main do Servidor aqui a ação três Diz que eu devo startar um uma aceitador de conexão

6:32e que eu devo passar para ela eu devo fornecer para ela a porta que vai ser usada para aceitar os períodos de conexão dos clientes e diz também que eu devo compartilhar com ela a estrutura de dados chamada usuários né Então essa é a

6:57ação número três vamos ver onde que isso está acontecendo na função Main no nosso método Main observem que eu declaro aceitador de conexão e observe que eu

7:18instanci aceitador de conexão fazendo New aceitador de conexão e observe também que eu passo pro construtor da aceitador de conexão Justamente a porta e a estrutura de dados chamada usuários que é o que tá dizendo aqui que eu devo

7:39eh fornecer eu preciso fornecer a porta e eu preciso compartilhar com ela a estur de dados chamada usuários então estão aqui ó na hora que eu crio a aceitador de conexão eu já passo pro Construtor dela a porta e a estrutura de dados chamada usuários E com isso a

8:01nossa aceitador de conexão está instanciada próximo comando eu starto a aceitador de conexão e com isso eu cumpro a nossa tarefa aqui de número três que tinha que startar uma aceitador

8:21já está aqui start a nossa aceitador e agora pessoal a gente pode dar por encerrado a parte da Main que a gente chama de início né o início da Main acaba aqui com essa terceira ação de iniciação e agora a gente passa para

8:42essa parte aqui que é a parte das tarefas simultâneas uma das tarefas simultâneas é feita pela própria Main na sua parte final né na parte final da M do Servidor a gente eh sabe que ela vai ficar executando junto com as tredes que

9:03forem startas e isso depois dela iniciar as tarefas de iniciação que fazem parte do início da M então aqui no final da M o que que vai acontecer o que que vai estar executando de forma simultânea junto com outras tredes que estão estadas o que

9:24seria isso que vai ser executado Aqui tá dizendo que mente a m deve interagir com o usuário que é o usuário administrador e deve avisar a ele que o servidor está ativo deve informar a ele que ele pode desativar o servidor se ele quiser

9:44digitando o comando desativar e também a Main nessa nessa nesse pedaço da implementação dela deve aguardar que algo seja digitado eh em informando que o que foi digitado está incorreto se de fato estiver

10:04incorreto né ou então se tiver sido digitado desativar deve acontecer o envio para todos os parceiros clientes que estão conectados ou seja presentes nessa estrutura de dados usuários deve ser

10:26enviado um comunicado de desligamento vamos ver se isso realmente tá acontecendo no final da implementação da Main observem aqui que nós temos um for infinito um for que implementa um

10:46Loop Infinito e nesse loop acontece de eu printar as seguintes coisas tá primeiramente é printar essa mensagem ó o servidor está ativo para desativá-lo aí na linha de baixo é

11:08printada uma outra mensagem que continua de cima né para desativá-lo use o comando desativar detalhe quando eu escrevo barra aspa como eu escrevi aqui isso tem o seguinte

11:29todo mundo sabe que aqui eu estou abrindo e aqui eu estou fechando um string aqui eu também tô abrindo mas eu não queria que aqui fechasse o string eu queria que essa aspa fizesse parte do string então eu escrevo barra aspa e essa aspa faz parte do string não fecha

11:52o string então o que que faz parte do string a palavra use a palavra o a palavra comando essa aspa a barra não faz parte do string a barra é só para indicar que a aspa vai fazer parte do string Então as aspas essa aspa aí vai fazer parte do string depois a palavra

12:13desativar também vai fazer parte do string essa outra aspa também vai fazer parte do string o Barra n para pular uma linha vai fazer parte do string e aqui sim eu estou fechando as aspas que eu abri aqui tá só fecha aqui repare que como aqui eu tenho um barra n pulo uma

12:34linha como Esse comando é print Alien pula outra linha o comando print Alien já pula a linha mas como Tem um barra n lá vai pular duas linhas tá E aí então vai ficar uma linha em branco e aí eu vou printar sem pular de linha porque eu não coloquei LN eu vou printar sem pular de linha esse

12:56maior e e esse maior seria o que a gente chama de prompt é uma indicação de que o servidor está pronto para ler a digitação de um comando aí o que acontece eu uso a classe teclado que a

13:17gente já conheceu anteriormente uso o método get 1 string do teclado para pegar um string que seria justamente o comando que a pessoa vai digitar na frente desse sinal de maior na frente porque não pulou de linha he então digitar aqui na frente alaisa e o que a pessoa digitar eu pegar

13:38aqui com esse teado PG string e guard aqui em comando comando foi decado como sendo string aí vez que eu peg o que a pessoa digitou que que eu fazer eu pegar o que ela digitou V transformar em letras minúsculas e vou

14:01ver se é igual desativar se for igual desativar então o que que eu vou fazer bom só um detalhe antes de falar o que eu vou fazer se for igual desativar reparem que eu usei equals para comparar Por que que eu não usei igual igual

14:23porque a gente já aprendeu aulas para trás que o igual igual com para endereços de memória todo objeto é um ponteiro todo objeto é um endereço de memória e o igual igual compara o endereço de memória que tá guardado no objeto que é um ponteiro se eu quero

14:46comparar aquele aquilo que ele aponta eu quero comparar o conteúdo apontado por esse ponteiro eu não posso usar igual igual tenho que usar equals e é justamente por isso que eu eu tô usando ipos esse true lower Case já diz que transforma em minúsculo Isso serve para

15:08eh transformar em minúsculo não importa o que o usuário digite se a pess se o usuário digitar desativar com letras maiúsculas aqui Eu transformo em minúscula comparo com o desativar que já está minúsculo e vou identificar que foi digitado desativado não importa como o usuário digite Eu transformo em menu

15:29compar com minúsculo E se for igual é o usurio digitou o comando desativar e aí o que que vai ser feito aí eu vou usar aquela palavrinha sincroniz que a gente aprendeu quando a gente [Música] estudou entre pares usurios que

15:51significa ISO significa que eu quero teresso exiv quero usar essa estrutura de dados usuários sem que nenhuma outra tred esteja usando ao mesmo tempo e o que que eu faço com os

16:12usuários eu faço o seguinte primeiramente eu declarei um objeto comunicado de desligamento um objeto dessa classe comunicado desligamento com c maiúsculo aqui é minúsculo né o objeto é aqui Aqui é a classe do objeto então declarei o

16:34objeto e já instancie ele com um novo comunicado de desligamento e agora eu faço o quê agora eu vou fazer esse for esse for tem uma sintaxe um pouco diferente a gente vê identifica né esse for pelo por esses dois pontos né esse for que tem um

16:57dois pontos é um for diferente a gente costuma Chamar esse for de for it ou em português para cada sempre que a gente Verê um for que tem essa sintaxe aqui que a gente percebe que existe nessa linha na hora que a gente vai ler o for a gente lê da seguinte maneira para

17:18cada parceiro [Música] usuário dentro de dentro dos usuários então para cada parceiro usuário ó para cada parceiro usuário dentro

17:39dos usuários e que eu vou fazer com cada usuário dentro dos usuários eu vou fazer o usuário receber esse objeto letra minúscula chamado comunicado de desligamento então

17:59eu mando o comunicado de desligamento para cada usuário que tá dentro da estrutura de dados usuários eu faço ele receber esse comunicado de desligamento chamando método receba né pro usuário receber e em seguida eu chamo método Adeus esse método Adeus

18:20eh se você D uma olhadinha lá na classe parceiro porque o usuário é da classe parceiro né se você der uma olhadinha lá na classe parceiro nesse método Adeus Você vai ver que esse método Adeus basicamente fecha a conexão com

18:42eh esse usuário aqui ele vai pegar desse usuário o receptor e vai fechar a conexão escrevendo Close depois vai pegar desse usuário aqui o transmissor e vai chamar o método Close depois vai pegar desse usuário aqui a conexão que é do tipo socket e vai chamar o método

19:02Close Então esse método que a gente chama de adeus Ele vai desconectar o usuário tá vai desconectar tudo do usuário o transmissor o receptor e a conexão dá uma olhadinha na implementação do método adeus Ele tá lá na classe

19:22parceiro Então pessoal é isso que fica acontecendo com continuamente no final da minha M só isso que depois desse for abriu aqui esse for Fecha aqui já termina m e já termina a classe servidor Então isso é

19:46tudo que fica acontecendo no final da M que executa junto com a aceit de conexões e possivelmente com várias eh supervisoras de conexão e agora pessoal a gente vai

20:08falar a respeito da segunda do segundo né tipo de tarefa simultânea que é realizada no servidor o primeiro a gente explicou para vocês agora a pouco ele é realizado pelo final do método m do servidor e esse segundo

20:31ele é realizado por essa trad aceitador de conexão antes de qualquer coisa eu vou substituir esse texto por um texto um pouquinho mais abrangente que aborda alguns detalhes que não estavam abordados aqui nesse texto Então eu vou fazer substituição eu

20:53já vou comentar com vocês pronto eh o que faz então esse segundo tipo de tarefa simultânea inicialmente ele vai declarar E vai instanciar um objeto da classe server

21:15socket esse objeto da classe server socket para poder ser declarado e instanciado ele vai precisar da porta porque o construtor de server socket precisa receber uma porta que seria a porta que vai ser usada para aceitar pedidos de conexão do dos

21:37clientes esse objeto que a gente vai declarar instanci classe server socket é justamente o objeto que tem a capacidade de aceitar pedidos de conexões porque é ele o objeto da classe server soet que tem um método chamado accept

21:58o método que aceita pedidos de conexão tá então inicialmente vai ser feito isso tá no próprio construtor da classe desse objeto aqui da classe aceitador de conexão então vai acontecer lá a declaração e a instanciação desse

22:21server socket Além disso vai acontecer de ser guardado no um atributo para poder ser usado depois ao longo de toda a classe em todos os métodos né o que que vai ser guardado num atributo a estrutura de dados usuários que foi

22:43compartilhada eh pela m quando a m instanci essa tred aqui da classe aceitador de conexão essa classe aqui eh esse objeto Zinho aqui aceitador de conão ele foi instanciado né pela Main e é justamente ele que é da

23:04classe aceitador de conexão com a maiúsculo é justamente ele que a me instanci e no Construtor dele a pro Construtor dele a Main passou para compartilhar essa estrutura de dados usuários tá ela foi passada pro Construtor Então agora que a gente vai

23:26ver a implementação da classe desse objeto né A gente vai ver que o Construtor guarda a estrutura que foi passada como parâmetro pro Construtor num atributo para que possa ser usado ao longo de toda a classe em todos os métodos tá

23:48isso é uma coisa que acontece inicialmente isso acontece no construtor da classe aceitador de conexão Depois já no método Run a nossa tred vai continuamente aceitar novas conexões com os programas cliente que

24:10pedirem e para cada Programa cliente que pediu uma conexão e a conexão fori aceita ela vai declarar ela vai instanciar e ela vai startar uma supervisora de conexão para supervisionar ou seja para atender todas

24:32as solicitações que forem recebidas pela conexão aceita eh Então vamos ver tudo isso sendo implementado na nossa classe aceitador de conexão vamos lá primeiramente a gente vê que nós temos

24:53esse Import aqui do java.net asterisco esse Import serve para quê serve para eu poder declarar eh objetos como server socket objetos da classe né server socket objetos da classe eh socket também tá essas classes

25:19socket server socket elas estão presentes aqui nessa biblioteca e por isso eu tô important ão important também a biblioteca Java P útil que é justamente onde eu tenho arraylist então para eu poder declarar aqui o meu arraylist eu tenho que incluir essa biblioteca E aí começa a

25:43nossa classe né que é a classe aceitador de conexão ela erda de trad portanto ela é uma trad e ela tem dois atributos tá um dos dois atributos é é chamado de pedido Ele é da classe server

26:03socket e o outro tributo se chama usuários que é justamente aquela estrutura de dados que é do tipo arraylist e que vai conter parceiros Lembrando que os parceiros do Servidor são os clientes que pediram conexões e que tiveram seus

26:26pedidos de conexão a todos eles vão ter seus acessos guardados aqui no aray list dentro de um objeto da classe parceiro Lembrando que a classe Parceiro tem conexão que é do tipo socket

26:46receptor que é do tipo Object input stream e transmissor que é do tipo Object output stream dá uma olhada na classe parceiro para você lembrar como que ela é então aqui nós vamos ter um Array list de parceiros chamado usuários e aqui temos o Construtor da nossa classe o

27:08Construtor da nossa classe recebe a porta que foi passada pela M essa porta pode ser a porta que foi indicada pelo usuário administrador quando ele acionou o programa essa porta pode ter do pega lá

27:29do vetor args portanto Mas caso o usuário administrador não tenha indicado nenhuma porta essa porta pode ser a porta padrão o fato é que a m passou essa porta e a passou também essa estrutura de dados usuários que é um Array list de

27:52parceiros aí o que que o meu Construtor faz meu Construtor primeiramente fica se realmente foi passada uma porta e se não foi ele lança uma exceção de porta ausente porque uma porta tem que ser passada nem que seja a porta padrão Ou então a porta que foi indicada pelo

28:12usuário administrador mas uma porta tem que ser passada é impossível o aceitador de conexão aceitar uma conexão sem ter uma porta Aí caso essa exceção não tenha acontecido estamos no Construtor hein eu vou fazer o seguinte eu vou instanciar esse objeto aqui que é o

28:34atributo Né [Música] pedido objeto da classe server socket ele vai ser instanciado ó pedido recebe New server socket e eu passo como parâmetro né pro construtor de server socket a porta que foi passada aqui pela

28:56Main transformar em int percebam que esse comandinho de instanciação dentro de um try Isso significa que esse comandinho aqui pode dar erro primeiro erro que pode acontecer aqui é na transformação para

29:16int pode acontecer que na hora de transformar para int de erro porque esse string né que foi passado aqui como parâmetro Pode ser que esse string contenha eh caracteres que não sejam exclusivamente numéricos E aí na hora que eu vou

29:38transformar para um ente Pode ser que dê erro Esse é um tipo de erro que pode acontecer aqui agora outro tipo de erro que pode acontecer aqui é quando eu passo Digamos que não aconteceu erro aqui deu para transformar num int numa boa agora eu passo esse int pro

29:59construtor de server socket e pode ser que essa porta que eu tô passando pro servidor do server socket seja uma porta inválida ou porque é um número negativo não existem portas negativas ou então porque é um número grande demais as portas T um limite de 65.000 e pouco

30:22então se for um número grande 70.000 80.000 100.000 vai dar erro pode acontecer também Dessa porta ser uma porta que já está em uso e portanto eu não posso agora decidir usá-la para criar esse server socket então esses tipos de erro podem acontecer aqui e se

30:43acontecerem eu vou dar essa exceção porta inválida se não acontecer eu vou verificar se foi de fato passado passada né aquela estrutura de dados chamada usuários se ela for nula significa que ela não foi passada então aí vai ter a

31:05exceção de usuários ausentes faltou fornecer a estrutura de dados usuários e se isso não aconteceu eu pego os usuários que foram recebidos e guardo no atributo e acabou o Construtor então quando o Construtor

31:26acaba aqui eu tenho a estrutura de dados recebida da M E aqui tá instanciado com o novo server socket com a porta que foi passada como parâmetro aqui pro Construtor Eh esses dois atributos estão

31:46[Música] eh instanciados e prontos para serem usados no resto da implementação da classe e o que que eu tenho no resto da implementação da classe como é uma trad né Toda trad tem um método chamado Run

32:06que é o que executa quando eu starto a trad sempre que eu faço start o que executa é o método Run e que que o método Run vai fazer antes de falar o que o método Run vai fazer percebam pessoal que isso que tá escrito aqui ó a instanciação dos server socket

32:30e o armazenamento num atributo da estrutura de dados que foi compartilhada pela Main Isso é o que o Construtor fez e é isso que tá previsto aqui que inicialmente seja feito tá inicialmente a gente tem que declarar e

32:51a gente declarou ó a gente tem tem que instanciar ó e a gente instanci um server soit que é usado para

33:12aceitar os pedidos de conexão além de guardar num atributo a estrutura de dados usuários que foi compartilhada pela Main e é o que foi feito aqui então esse Construtor aqui cumpriu fez o que estava escrito aqui

33:33que inicialmente né deveria ser feito mas logo em seguida está dito aqui que a minha tred deve passar a continuamente aceitar novas conexões cadê isso esse já tá no método

33:54Run então observem que no método Run a gente tem é um loop e esse loop é um Loop Infinito significa que ele vai ficar sempre executando e é isso justamente que vai fazer que continuamente a aceitação de novas conexões aconteça por que que vai ser

34:16continuamente por causa desse loop e o que que acontece dentro dele naturalmente a aceitação de novas conexões né acontece dentro dele vamos ver eu declaro um socket e eu faço o socket receber pedido ponto accept Ou seja eu estou aceitando pedidos e gerando conexão tá

34:40então eu Gero uma conexão aceitando um pedido é justamente o que tá acontecendo aqui ó um loop para ser continuamente e isso é a aceitação de uma conexão então ó continuamente aceitar novas conexões tá acontecendo aqui isso tá aí o que acontece para cada

35:04conexão que for aceita Aqui tá dizendo que deve ser instanciada uma supervisora de conexão para supervisionar aquela conexão então observem aqui o que que tá acontecendo ó logo depois aqui da minha

35:25instanciação eu tenho a declaração de uma supervisora de conexão a instanciação dessa supervisora de conexão e eu passo pro Construtor dela Qual é a conexão que ela tem que supervisionar Note que a conexão que ela

35:45tem que supervisionar é justamente a conexão que eu aceitei Acabei de aceitar na aceitador uma conexão e eu já tô passando a conexão que eu acabei de aceitar para essa supervisora supervisionar e eu passo também pra supervisora a estrutura de dados

36:07usuários feito isso eu starto a supervisora Então é isso que fica continuamente sendo feito aqui no meu método Run continuamente por causa da repetição aceita a conexão

36:28declara e Instância uma supervisora para supervisionar essa conexão que é justamente a conexão que foi aceita e starta a supervisora e aí ela começa a Executar a supervisora começa a executar e começa a

36:49supervisionar essa conexão isso fica sendo continuamente feito e para encerrar essa videoaula eu quero falar sobre o terceiro tipo de tarefa simultânea que acontece terceiro tipo de tarefa

37:10simultânea que acontece no servidor que é realizada no servidor esse terceiro tipo de tarefa aqui é importante ressaltar é um tipo de tarefa que pode acontecer em em pode ser executado em multiplicidade que significa isso

37:33significa que eu só tenho uma Main eu só tenho um final dessa Main que fica executando simultâneamente com uma aceitador eu só tenho uma aceitador que fica executando junto com esse final da M mas eu não

37:55tenho só uma supervis eu posso ter muitas supervisoras por quê porque cada conexão que for aceita pela aceitador cada uma das das das

38:15conexões né que forem aceitas pela aceitador vai gerar uma supervisora porque cada conexão é supervisionada por uma supervisora então aceitou uma conexão vai ser declarado instanciado startado uma supervisora aceitou mais uma conexão vai ser declarado

38:36instanciado startado mais uma supervisora então supervisoras podem executar em multiplicidade eu posso ter uma quantidade enorme de supervisoras executando Mas eu só tenho uma Main para no final realizar essas

38:59tarefas aqui eu só tenho uma aceitador para realizar essas tarefas aqui então fica o final da Main executando simultaneamente com uma aceitador que por sua vez executa

39:21simultaneamente Possivelmente com várias supervisoras porque as supervisoras são estadas para cada conexão e o que que as supervisoras fazem inicialmente no construtor da supervisora a gente

39:41deve instanciar um transmissor que vai ser do tipo Object output stream a gente deve instanciar um receptor que vai ser do tipo Object input stream então transmissor Object

40:02output stream receptor Object input stream ambos tanto o receptor quanto o transmissor Associados a conexão que a supervisora supervisiona Lembrando que cada supervisora supervisiona uma conexão e é

40:23justamente a essa conexão que vão estar associados o transmissor e o receptor que eu vou declarar e instanciar E aí com tudo isso com a conexão com o transmissor com o receptor vai ser instanciado um parceiro

40:45cliente que vai ser usado ao longo de toda a execução da nossa trad para se comunicar com o cliente então vamos ver isso acontecendo lá na nossa classe supervisora de [Música] conexão observem que a supervisora de

41:08conexão é uma trad observem que a supervisora de conexão Import java.net porque ela precisa usar sockets e sockets estão nessa biblioteca aqui

41:28ela também importa a biblioteca java.io isso porque ela vai usar eh is porque ela vai usar Object output stream e

41:49também obj input stream essas duas coisas esses essas duas classes elas fazem parte dessa biblioteca aqui ó java.io e finalmente ela importa essa biblioteca aqui Java pon útil por causa do arraylist que ela tá usando então nós

42:10temos aqui as três bibliotecas sendo importadas aí na supervisora que é uma classe que erda de trad eu tenho os seguintes atributos um valor que é do tipo Double que inicialmente V zero Imagino que todos vocês se lembram

42:30que em vários pontos dessas videoaulas anteriores eu disse que todo cliente tem no servidor um valor que inicialmente é zero mas ele pode pedir uma adição pode pedir uma subtração pode pedir uma multiplicação pode pedir uma divisão e pode portanto

42:52alterar esse valor tá aqui o valor cada supervisora de conexão que eu startar vai conter o valor que teria no servidor para aquele cliente então o valor que cada cliente tem Fica onde no servidor na supervisora de conexão que mais que nós temos aqui

43:13na supervisora de conexão nós temos também um objeto chamado usuário que é do tipo parceiro e esse é justamente o cliente né que a gente vai supervisionar temos

43:35ainda uma conexão é do tipo socket e o usuários que é aquela estrutura de dados que eu já expliquei que a que a m compartilha com a aceitador e a aceitador compartilha com as supervisoras que ela starta é uma estura de dados que guarda parceiros lembrando

43:57que os parceiros do Servidor são os clientes aqui está o Construtor da classe supervisora ele recebe da Main a conexão que deve ser supervisionada e o arraylist de parceiros que é chamado de

44:20usuários e o que que ele faz ele checa se a conexão é nula e dá uma exceção de conexão ausente ele checa se a estrutura de dados usuários é nula e dá uma exceção de usuários ausentes e se nada disso aconteceu Ele pega a conexão que foi recebida com o parâmetro e guarda no

44:42atributo Conexão e pega a estura de dados usuários que foi recebida como parâmetro e guarda no atributo usuários o atributo conexão e o atributo usuários foram declarados aqui em cima ó usuários e conexão dois atributos aqui então é

45:07isso que o Construtor faz depois o que que é feito no método Run o método Run ele ainda antes dessa parte aqui do continuamente tá ainda antes do continuamente ainda estamos aqui inicialmente é o início do Run ainda não

45:31chegou nenhum loop né que que vai acontecer agora agora vai acontecer aquilo que eu disse aqui ó declaração instanciação do transmissor declaração instanciação do receptor declaração instanciação do parceiro observem tudo isso acontecendo

45:51aqui declara o transmissor instancia instancia associado à conexão hein depois declara o receptor e instancia instancia associado a conexão também

46:12hein E aí aí com tudo isso com tudo isso ó e conexão transmissor receptor ele vai instanciar um parceiro ó eu instanciando Parceiro aqui ó usuário igual New

46:34parceiro passa a conexão pro Construtor do parceiro passa o receptor pro Construtor do parceiro passa o transmissor pro Construtor do parceiro então ó com tudo isso aqui fizemos a instanciação de um parceiro e agora agora nós vamos fazer o seguinte

46:57nós vamos requisitar uso exclusivo da estrutura de dados usuários ou seja nós queremos usar sem que ninguém mais nenhuma outra trad esteja usando e nós vamos adicionar na estrutura de dados

47:17usuários aquele usuário que a gente acabou de instanciar aqui em cima agora dentro dessa estrutura já tem mais um usuário ou seja mais um cliente do Servidor já está aqui dentro e quando

47:38alguma hora o servidor quiser mandar uma mensagem para todos os clientes para todos os usuários que estão aqui esse cliente que eu acabei de adicionar também vai receber porque afinal de contas ele foi adicionado ele também estará aqui então com isso encerra a parte do

47:59inicialmente agora começa a parte do continuamente então agora continuamente a nossa TR supervisor de conexão continuamente receber o que for enviado pelo

48:19parceiro e atender o que for solicitado Então vamos ver que isso acontece temos aqui a parte do continuamente é um loop para fazer essa continuidade né e o que acontece dentro desse loop eu declaro um objeto chamado comunicado com c minúsculo da classe comunicado com c

48:43maiúsculo e eu faço esse comunicado receber des ponto usuário ponto envie Então eu estou pedindo eu tô pedindo pro cliente que essa supervisora está supervisionando estou pedindo para ele

49:04me enviar um comunicado e o comunicado que ele me enviar eu guardo aqui aí o que eu faço aí eu faço o seguinte se não veio comunicado nenhhum

49:24eu termino execução desse método senão veio um comunicado aí eu vou ver que tipo de comunicado que foi se o comunicado é Instância da classe pedido de

49:47operação Então se o que veio foi um comunicado desse tipo aqui ó pedido de operação se o comunicado for Instância da classe pedido de operação Então é porque o cliente usuário tá pedindo um mais ou um menos

50:07ou um vezes ou um dividir então o que que eu faço nesse caso nesse caso eu faço o seguinte declaro um pedido de operação do tipo pedido de operação o objeto pedido de operação tem P minúsculo e ele é da classe pedido de operação com P

50:29maiúsculo declarei e coloquei nesse objeto o comunicado que eu acabei de receber visto como um pedido de operação ó esse esse parênteses pedido de operação aqui significa o quê significa que eu estou

50:49forçando comunicado a ser visto como algo desse tipo e eu posso fazer isso porque eu sei que é desse tipo já que antes eu testei esse comunicado era do tipo pedido de operação então o que que eu tenho guardado aqui eu tenho guardado o pedido

51:09de operação recebido não mais com tipo comunicado mas com tipo pedido de operação porque eu fiz essa alteração de tipo e agora agora eu vou pegar o pedido de operação que é esse objeto aqui e vou pegar com o

51:30getter né get operação eu vou pegar lá de dentro do pedido de operação Qual é a operação desejada pelo usuário ou seja pelo cliente que está sendo supervisionado por esta supervisora aí eu vou ver se for mais então eu pego o

51:51valor que é aquele valor que eu declarei aqui em cima e que eu disse que inicialmente valia Esse é o valor que todo cliente tem no servidor inicialmente ele vale zero Então o que eu vou fazer eu vou pegar né aquele valor e vou somar nele pedido de

52:11operação ponto get valor ou seja o valor que estão querendo somar e Break Se for menos eu vou pegar o valor e eu vou subtrair dele o o valor que está lá no pedido de operação e

52:32Break se for vezes eu vou multiplicar o valor que tá aqui pelo valor que veio no pedido de operação e Break E se for divisão eu vou dividir o valor pelo valor que veio no

52:52pedido de operação eu consigo esse valor usando o m do get valor não preciso de break porque é o último Case Então não precisa de break então isso tudo eu faço quando o comunicado é um pedido de operação Mas e se ele não for se ele não

53:14for eu vou cair aqui nesse else e eu vou ver se o comunicado é um pedido de resultado se for um pedido de resultado porque o usuário porque o cliente que essa supervisora supervisiona Ele quer saber quanto que

53:35tem guardado no momento nessa variável aqui que inicialmente Era Zero mas pode ter mudado porque eu mandei somar eu mandei subtrair eu mandei multiplicar eu mandei dividir ela pode ter mudado e eu quero saber qual é o valor que tem nela agora é isso que eu quero quando

53:55[Música] é recebido né um objeto dessa classe aqui ó então quando o comunicado é um objeto dessa classe aqui ó pedido de resultado Então é porque o usuário é

54:17porque o cliente que tá conectado E sendo supervisionado pela minha supervisora mandou um comunicado que era um pedido de resultado nesse caso o que eu faço eu crio uma Instância de resultado Passando pro construtor de resultado o valor que tá lá no atributo

54:38valor aquele lá em cima que começou valendo zero então eu pego o valor atual né Desse atributo com esse valor passando ele pro construtor de resultado eu crio um novo resultado E aí eu pego esse resultado e e faço o usuário

55:00recebê-lo eu faço o uso do método receba usuário receba o novo resultado Quem quer ser usuário esse usuário é o cliente que o meu servidor está atendendo nesse momento é o cliente que esta supervisora está supervisionando mas e se o comunicado

55:20não for um pedido de resultado aí eu devo cair nesse elc aqui E aí eu vou ver se o comunicado é uma Instância de pedido para sair porque pode ser que o o cliente esteja querendo sair esteja querendo parar de usar o

55:40servidor Então se se for um pedido para sair se o meu comunicado for um pedido para sair o que que eu faço eu peço para usar sozinho para ser o único a usar usar sem nenhum uma outra tred estar usando a estrutura de dados usuários que

56:01é onde ficam guardados todos os usuários do Servidor que são os clientes né que se conectam nele que que eu faço peço para usar essa estrutura onde todos Estão guardados peço para usar sozinho sem nenhuma outra tred estar usando E aí eu mando remover dessa

56:22estrutura de dados ou usuários visionado por quê Porque ele pediu para sair ele não deve mais estar entre os usuários que eh estão sendo atendidos pelo servidor e em seguida Eu uso o método Adeus usuário Adeus que que o

56:44método Adeus faz mesmo dá uma olhada lá na classe parceiro basicamente desconecta desse usuário o transmissor o receptor e a conexão usando o método Close vai fazer transmissor pclose receptor pclose e conexão P close e acabou é isso que essa

57:08nossa trad faz tá essa nossa tred eh que é a tred supervisora ela faz isso ela atende os pedidos do cliente que é o usuário né do cliente então se o cliente tá querendo somar tá querendo subtrair

57:29tá querendo um resultado essa nossa tred vai atendê-lo Nossa tred atende aos desejos desse usuário e com isso a gente encerra essa série de vídeos que eh

57:50apresentou para vocês o sistema de programa com arquitetura cliente servidor que era o nosso fazedor de conhas espero que vocês tenham todos compreendido muito bem esse sistema de programas e que tenham

58:11aprendido as técnicas que costumam ser usadas para se fazer um programa cliente um programa servidor se comunicarem e trabalharem colaborativamente cooperativamente ou seja construir um sistema de programas com arquitetura

58:33cliente servidor É isso aí

Recently added transcripts

Browse the whole transcript library Browse all Portuguese transcripts

This transcript was generated from the captions YouTube publishes for this video. Get the transcript of any YouTube video atfreeyoutubetranscribe.com, free, unlimited, no sign-up.