{"id":16576188,"url":"https://github.com/emersonmello/sockets-java","last_synced_at":"2025-10-15T18:00:16.284Z","repository":{"id":227517323,"uuid":"771116894","full_name":"emersonmello/sockets-java","owner":"emersonmello","description":"Exemplo simples de como trabalhar com sockets TCP com a API Java I/O","archived":false,"fork":false,"pushed_at":"2024-11-18T11:23:49.000Z","size":736,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-05T18:38:15.572Z","etag":null,"topics":["java","multicast","socket-programming","sockets","sockets-tcp","sockets-udp"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/emersonmello.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-12T18:03:31.000Z","updated_at":"2024-11-18T11:23:53.000Z","dependencies_parsed_at":"2024-04-10T00:20:43.375Z","dependency_job_id":"2184ce6c-a7bf-4ae0-945c-c0b50cbdd778","html_url":"https://github.com/emersonmello/sockets-java","commit_stats":{"total_commits":10,"total_committers":1,"mean_commits":10.0,"dds":0.0,"last_synced_commit":"80a4ddb246009bbbbd31416193b11e4935dd9d55"},"previous_names":["std29006/sockets-java","emersonmello/sockets-java"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/emersonmello/sockets-java","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emersonmello%2Fsockets-java","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emersonmello%2Fsockets-java/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emersonmello%2Fsockets-java/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emersonmello%2Fsockets-java/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/emersonmello","download_url":"https://codeload.github.com/emersonmello/sockets-java/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/emersonmello%2Fsockets-java/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279098660,"owners_count":26103089,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-15T02:00:07.814Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","multicast","socket-programming","sockets","sockets-tcp","sockets-udp"],"created_at":"2024-10-11T22:07:27.583Z","updated_at":"2025-10-15T18:00:16.214Z","avatar_url":"https://github.com/emersonmello.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Java CI with Gradle](https://github.com/emersonmello/sockets-java/actions/workflows/gradle.yml/badge.svg)](https://github.com/std29006/sockets-java/actions/workflows/gradle.yml)\n\n# Exemplos de sockets TCP e UDP com a API Java I/O\n\n\u003e ## Aviso de isenção de responsabilidade\n\u003e \n\u003e Para os códigos aqui disponibilizados optou-se por uma organização simplificada para facilitar a leitura e entendimento. Contudo, o código aqui apresentado tem grande potencial de melhorias para torná-lo adequado para atender situações reais ou mesmo, para atender demandas das listas de exercícios e projetos desenvolvidos dentro da disciplina.\n\nJava possui diferentes APIs para lidar com operações de I/O:. Aqui é apresentado um exemplo com a API Java I/O, que segue modelo bloqueante.\n\nA API Java NIO.2 permite desenvolver aplicações com comunicação assíncrona, porém seu entendimento demanda mais tempo. Veja mais detalhes na [documentação oficial da Oracle](https://docs.oracle.com/javase/8/docs/technotes/guides/io/index.html). \n\nNo arquivo [build.gradle](app/build.gradle) foram criadas tarefas para permitir executar servidor e o cliente (TCP e UDP) diretamente com o [gradle](https://www.gradle.org). Abaixo são apresentados os comandos para execução dos exemplos.\n\n\n## Sockets TCP\n\nO servidor cria uma *Thread* para atender cada cliente e essa Thread é destruída após isso.\n\n```mermaid\n%%{init: {'sequence': {'mirrorActors':false} } }%%\nsequenceDiagram\n    Servidor -\u003e\u003e Servidor: cria socket\n    loop Servidor aguarda por conexões de Clientes \n        Cliente -\u003e\u003e Servidor: conecta\n        create participant AtenderCliente \n        Servidor --\u003e\u003e AtenderCliente: Criar thread com dados do cliente\n        end\n        Cliente -\u003e\u003e AtenderCliente: Olá, servidor!\n        AtenderCliente -\u003e\u003e AtenderCliente: imprimir mensagem recebida\n        AtenderCliente --\u003e\u003e Cliente: Mensagem recebida com sucesso!\n        Cliente -\u003e\u003e Cliente: imprimir resposta do servidor\n        destroy AtenderCliente\n```\n\n1. `Servidor` cria socket TCP e aguarda por conexões\n1. `Cliente` conecta no servidor\n1. `Servidor` cria uma Thread (`AtenderCliente`) para atender o `Cliente`\n1. `Cliente` envia mensagem de saudação\n1. `AtenderCliente` imprime a mensagem recebida no console\n1. `AtenderCliente` envia resposta ao `Cliente`\n1. `Cliente` imprime a mensagem recebida no console\n1. `AtenderCliente` é encerrada\n1. `Cliente` é encerrado\n\n\n### Como executar o servidor TCP\n\nAbra um terminal e execute uma das linhas abaixo de acordo com o sistema operacional do computador que esteja usando.\n\n```bash\n# No Linux ou macOS\n./gradlew -q servidorTcp\n\n# No Windows\ngradle.bat -q servidorTcp\n```\n\n### Como executar o cliente TCP\n\nAbra um outro terminal e execute uma das linhas abaixo.\n\n```bash\n# Tentará conectar na porta 12345 na localhost\n./gradlew -q clienteTcp\n\n# Passando o IP e porta do tcp como argumentos de linha de comando\n./gradlew -q clienteTcp --args \"localhost 12345\"\n```\n\n## Sockets UDP\n\n```mermaid\n%%{init: {'sequence': {'mirrorActors':false} } }%%\nsequenceDiagram\n    Servidor -\u003e\u003e Servidor: cria socket\n    Cliente -\u003e\u003e Cliente: cria socket\n    Cliente -\u003e\u003e Servidor: Olá, eu sou o cliente UDP!\n    Servidor -\u003e\u003e Servidor: imprime mensagem recebida\n    Servidor -\u003e\u003e Cliente: Olá, eu sou o servidor UDP!\n    Cliente -\u003e\u003e Cliente: imprime mensagem recebida\n```\n\n1. Servidor cria socket UDP\n2. Cliente cria socket UDP\n3. Servidor aguarda por datagrama\n4. Cliente envia datagrama\n5. Cliente aguarda por datagrama\n6. Servidor imprime no console\n7. Servidor envia datagrama\n8. Cliente imprime no console\n\n### Como executar o servidor UDP\n\nAbra um terminal e execute a linha abaixo.\n\n```bash\n./gradlew -q servidorUdp\n```\n\n### Como executar o cliente UDP\n\nAbra um outro terminal e execute uma das linhas abaixo.\n\n\n```bash\n# Tentará conectar na porta 9876 na localhost\n./gradlew -q clienteUdp\n\n# Passando o IP e porta do tcp como argumentos de linha de comando\n./gradlew -q clienteUdp --args \"localhost 9876\"\n```\n\n## Comunicação Multicast\n\nNeste exemplo, o servidor envia periodicamente uma mensagem com sua hora local para um grupo de clientes que estão escutando em um endereço multicast.\n\nO cliente, para todas interfaces de rede, escuta em um endereço multicast e imprime no console a mensagem recebida do servidor.\n\n![captura de tela do cliente e servidor multicast](img/multicast-captura.png)\n\n### Como executar o servidor Multicast\n\nAbra um terminal e execute a linha abaixo.\n\n```bash\n./gradlew -q servidorMulticast\n```\n\n### Como executar o cliente Multicast\n\nAbra um outro terminal e execute a linha abaixo.\n\n```bash\n./gradlew -q clienteMulticast\n```\n\nPara encerrar a execução do servidor ou do cliente, pressione `Ctrl+C` no terminal onde o programa está sendo executado.\n\nPara ambos os casos, o endereço multicast utilizado é `231.0.0.0` e a porta `8888`. É possível passar outros valores como argumentos de linha de comando.\n\n```bash \n./gradlew -q servidorMulticast --args \"231.0.0.1 8889\"\n./gradlew -q clienteMulticast  --args \"231.0.0.1 8889\"\n```\n\n\n### Referências\n\n- https://en.wikipedia.org/wiki/Multicast_address\n- https://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml\n- https://github.com/jppf-grid/JPPF/blob/master/common/src/java/org/jppf/comm/discovery/JPPFBroadcaster.java\n- https://github.com/jppf-grid/JPPF/blob/master/client/src/java/org/jppf/client/JPPFMulticastReceiverThread.java\n- https://github.com/jppf-grid/JPPF/blob/master/common/src/java/org/jppf/comm/discovery/JPPFMulticastReceiver.java","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femersonmello%2Fsockets-java","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Femersonmello%2Fsockets-java","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Femersonmello%2Fsockets-java/lists"}