SocketsObjetivosApos completar voce devera ser capaz de: Entender o conceito de socketConectar-se a computadores remotos utilizando sockets Criar programas Cliente-Servidor Entender o conceito de DatagramaConhecer as classes de Datagramas disponiveis em JavaO que sao SocketsSockets sao abstracoes de software utilizadas para representar as duas pontas de uma conexao. Para uma determinada conexao existe um socket em cada uma das maquinas. Entre estes dois sockets trafegam os dados da conexao. Esta abstracao permite que se programe a comunicacao entre computadores sem o conhecimento do hardware e cabeamento de uma redeUm socket e uma ponta logica de uma conexao entre programas rodando em uma rede. Portanto, para cada conexao existem dois sockets, um em cada ponta da comunicacao. Esta abstracao faz com que o conhecimento da parte fisica que compreende os conectores e os cabos nao seja necessario no programa, pois a transferencia de dados e tratada da mesma maneira que o acesso a arquivos comuns(streams).Funcionamento de SocketsEm Java, um socket e criado apenas para iniciar a conexao entre computadores. Em uma das maquinas, um programa servidor (classe ServerSocket ou outro tipo de servidor que aceite conexoes TCP) e executado e fica aguardando uma conexao em uma determinada porta (metodo accept()).Outra maquina age como cliente (classe Socket) e faz uma requisicao usando o endereco e a porta de um possivel servidor. Caso a conexao ocorra com sucesso, o metodo accept( ) do programa servidor retorna um Socket e a transferencia de dados pode ser iniciada. Repare que a partir deste instante nao existe mais uma maquina cliente e outra servidor, pois ambas podem enviar e receber dados. A distincao e feita apenas para identificar quem esta ouvindo e quem solicita a comunicacao. E a aplicacao que ira determinar quem sera o servidor e quem sera o cliente. Apos o estabelecimento da conexao deve-se abrir um canal para a transferencia dos dados, atraves do uso de streams. Cada ponto conectado possui duas streams: InputStream, para recebimento e OutputStream, para o envio de dados.Com este formato fica muito facil enviar e receber dados, bastando para isso o uso das funcoes de streams como read() e write().Deve-se destacar que tanto a conexao quanto a transferencia sao realizadas sem nenhum conhecimento sobre qual placa de rede esta sendo usada, bem como plataforma, funcionamento do protocolo etc. A seguir sao apresentadas as classes e funcoes necessarias para realizar o processo aqui descrito.A Classe SocketClasse que representa um socket em Java. Possui diversos construtores para facilitar o uso, mas basicamente os parametros solicitados sao: identificacao do servidor" e porta do servico requisitado. O proprio construtor e o responsavel pela solicitacao da conexao e continua tentando ate que ocorra: sucesso, erro de E/S ou endereco nao encontrado. void setSoTimeout()Indica o tempo maximo (em milissegundos) que uma operacao de leitura deve aguardar. Se for definido um timeout de 0 (zero) o tempo maximo e infinito. InetAddress getLocalAddress() int getLocalPort()Retornam o endereco e a porta do computador no qual o socket esta sendo executado. InetAddress getInetAddress() int getPort()Retornam o endereco e a porta do computador no qual o socket esta conectado. InputStream getInputStream() OutputStream getOutputStream()Retornam os streams padroes para entrada e saida de dados. Atraves de filtros apropriados podem ser convertidos para outros tipos de streams. void close() Fecha a conexao. Lendo Dados com SocketsPara abrir uma conexao, deve-se criar um objeto da classe Socket, passando como parametro uma localizacao e uma porta.O construtor do socket tenta conectar-se ate que ocorra sucesso, erro de I/O ou endereco nao encontrado. Apos a conexao efetivada abre-se uma stream de entrada para recuperacao dos dados com getlnputStream().O protocolo de comunicacao utilizado pela classe Socket e o TCP. Para abrir uma conexao, deve-se criar um objeto da classe Socket, passando como parametro uma localizacao e uma porta.O construtor do socket tenta conectar-se com a URL indicada ate que ocorra sucesso, erro de E/S ou endereco nao seja encontrado. Apos a conexao efetivada abre-se uma stream de entrada para recuperacao dos dados com o metodo getInputStream( ).Geralmente se transforma esse stream em uma outra classe de E/S que tenha o nivel desejado de funcionalidade para o usuario. Para isso usam-se as classes de E/S do Java considerando que o stream de entrada retornado pelo metodo getInputStream() e uma instancia da familia da classe InputStream.O protocolo de comunicacao utilizado pela classe Socket e o TCP. Definindo um Timeout de E/SUma operacao de E/S ou mesmo a abertura da conexao podem durar indefinidamente. Para evitar este problema pode ser definido um tempo maximo (timeout) para a conclusao da tarefa.O metodo setSoTimeOut e utilizado para a definicao do tempo maximo de todas as operacoes subsequentes. Timeout de ConexaoA partir da versao 1.4 do Java, e possivel se indicar um tempo de timeout na c