<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Diogo Izele</title>
    <description>The latest articles on Forem by Diogo Izele (@diogoizele).</description>
    <link>https://forem.com/diogoizele</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1002584%2Ffe2a9bcb-dd0d-46ec-84a3-7c73a741d356.png</url>
      <title>Forem: Diogo Izele</title>
      <link>https://forem.com/diogoizele</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/diogoizele"/>
    <language>en</language>
    <item>
      <title>Grupos e Usuários em Linux: O que você precisa saber?</title>
      <dc:creator>Diogo Izele</dc:creator>
      <pubDate>Tue, 26 Sep 2023 02:20:19 +0000</pubDate>
      <link>https://forem.com/diogoizele/grupos-e-usuarios-em-linux-o-que-voce-precisa-saber-4lp9</link>
      <guid>https://forem.com/diogoizele/grupos-e-usuarios-em-linux-o-que-voce-precisa-saber-4lp9</guid>
      <description>&lt;p&gt;No universo do Linux, os conceitos de grupos e usuários desempenham um papel crucial na administração de sistemas, garantindo a segurança e a gestão das permissões 🐧. &lt;/p&gt;

&lt;p&gt;Neste artigo, vamos desvendar o que são grupos e usuários no Linux de uma maneira fácil de entender, para que, mesmo se você está começando sua jornada no Linux, possa ter um controle melhor sobre quem pode fazer o quê no seu sistema. Vamos começar! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Conhecendo as Bases
&lt;/h2&gt;

&lt;p&gt;Os &lt;strong&gt;usuários&lt;/strong&gt; nada mais são do que pessoas que interagem com o sistema Linux. Cada usuário possui sua própria identidade, área de trabalho e permissões específicas. É como ter várias contas em um computador, uma para cada pessoa que utiliza o sistema.&lt;/p&gt;

&lt;p&gt;Mas você pode estar se perguntando: "Qual a vantagem de ter vários usuários em uma mesma máquina e por que eu iria querer fazer isso?" &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdquxlwuqcbviqq8lp5s.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdquxlwuqcbviqq8lp5s.gif" alt="Gif animado do Batman no formato Cartoon pensativo" width="500" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Embora em máquinas pessoais seja comum ter apenas um usuário (você mesmo), a ideia de vários usuários em um sistema brilha em cenários onde várias pessoas precisam acessar o mesmo computador ou servidor. Veja como isso faz sentido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Empresas&lt;/strong&gt;: Cada funcionário teria sua conta de usuário para acessar recursos compartilhados e manter seus próprios arquivos privados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escolas&lt;/strong&gt;: Alunos e professores podem ter contas separadas para manter a privacidade de suas notas e materiais de ensino.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Servidores da web&lt;/strong&gt;: Diferentes equipes, como desenvolvedores, analistas de banco de dados e suporte, podem ter contas separadas para acessar apenas o que é necessário para suas funções.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa organização facilita a administração do sistema, permite o compartilhamento controlado de recursos e garante a segurança, pois cada usuário só pode acessar o que lhe é permitido.&lt;/p&gt;

&lt;p&gt;Imagine sua máquina como uma casa onde você é o proprietário (admin), mas ocasionalmente recebe visita ou permite que outras pessoas usem algumas áreas. Ter vários usuários permite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Privacidade&lt;/strong&gt;: Cada usuário tem sua própria área protegida por senha, mantendo seus arquivos e configurações pessoais seguros.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compartilhamento seletivo&lt;/strong&gt;: Você pode compartilhar sua máquina com familiares ou colegas, dando a eles contas de usuário separadas para que usem sem acesso aos seus dados privados.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Controle de acesso&lt;/strong&gt;: É possível definir permissões para cada usuário, permitindo ou restringindo o acesso a arquivos e programas. Isso é útil em ambientes onde você deseja limitar o que outras pessoas podem fazer.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No entanto, à medida que as necessidades e funções dos usuários se tornam mais complexas, a organização em grupos se torna ainda mais necessária. &lt;/p&gt;

&lt;p&gt;Vamos agora explorar como os grupos de permissões podem simplificar ainda mais essa gestão e garantir que seu sistema Linux funcione de maneira eficiente e segura. 🗃️💻&lt;/p&gt;

&lt;p&gt;Enquanto os usuários representam pessoas individuais no Linux, os grupos de permissões funcionam como categorias ou clubes que podem incluir vários usuários com interesses ou necessidades semelhantes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Grupo "Desenvolvedores"&lt;/strong&gt;: Este grupo incluiria todos os usuários envolvidos no desenvolvimento de software. Eles podem ter permissões para acessar ferramentas de desenvolvimento específicas e pastas relacionadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Grupo "Administradores"&lt;/strong&gt;: Os administradores, como o nome sugere, são responsáveis por gerenciar o sistema. Eles têm acesso completo para realizar tarefas de manutenção, configuração e administração.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Grupo "Usuários Comuns"&lt;/strong&gt;: Este grupo é composto por usuários regulares que têm permissões padrão, permitindo apenas o uso cotidiano do sistema.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Colocando em Prática
&lt;/h2&gt;

&lt;p&gt;Mãos à obra! Aqui, mostrarei como criar usuários, definir senhas, criar um arquivo com conteúdo, criar um grupo, atribuir permissões ao grupo e demonstrar como o acesso é controlado. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9770oo54nnvyobavf05.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9770oo54nnvyobavf05.gif" alt="Thanos sucumbindo com a legenda: " width="800" height="330"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando Usuários
&lt;/h3&gt;

&lt;p&gt;Primeiro, vamos criar dois novos usuários, um chamado &lt;code&gt;horacio&lt;/code&gt; e outro chamado &lt;code&gt;rosita&lt;/code&gt;. Existem duas formas comuns de fazer isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;useradd horacio

&lt;span class="c"&gt;# ou&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;adduser rosita
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que ambos os comandos, &lt;code&gt;useradd&lt;/code&gt; e &lt;code&gt;adduser&lt;/code&gt;, são utilizados para criar novos usuários no sistema Linux, mas diferem em alguns aspectos importantes.&lt;/p&gt;

&lt;h4&gt;
  
  
  useradd
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;O comando useradd é uma ferramenta de linha de comando mais básica e direta para adicionar novos usuários ao sistema. Ele realiza a tarefa fundamental de criar um novo usuário, mas não fornece uma interface interativa amigável durante o processo. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  adduser
&lt;/h4&gt;

&lt;blockquote&gt;
&lt;p&gt;Por outro lado, o comando adduser é uma ferramenta mais amigável e interativa para criar novos usuários. Ele apresenta uma série de perguntas durante o processo de criação, como o nome completo do usuário, senha e grupos adicionais, tornando a tarefa mais simples para iniciantes.&lt;/p&gt;

&lt;p&gt;O adduser também cuida automaticamente de várias configurações padrão, como a criação de uma pasta inicial para o usuário em &lt;code&gt;/home&lt;/code&gt; e a atribuição de um shell padrão.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyns5hh169xagb7rck2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyns5hh169xagb7rck2l.png" alt="Execução dos comandos useradd e adduser" width="657" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Adicionando Senhas aos Usuários
&lt;/h3&gt;

&lt;p&gt;Agora que os usuários estão criados, é importante adicionar senhas a eles para garantir a segurança das contas. Caso você tenha criado seu usuário utilizando o comando &lt;code&gt;adduser&lt;/code&gt;, esse processo não é necessário, utilize para usuários criados com &lt;code&gt;useradd&lt;/code&gt;. Você pode fazer isso usando o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;passwd horacio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O sistema solicitará que você insira e confirme a senha para o usuário horacio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando um Arquivo e Controlando o Acesso
&lt;/h3&gt;

&lt;p&gt;Vamos criar um arquivo de exemplo na pasta inicial do usuário horacio:&lt;/p&gt;

&lt;p&gt;⚠️ Lembre-se que o usuário horacio foi criado com o comando &lt;code&gt;useradd&lt;/code&gt;, logo, precisaremos fazer algumas configurações de forma manual.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjaegqt4jmx8ippdbgz3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjaegqt4jmx8ippdbgz3.png" alt="Criando a pasta inicial do usuario horacio" width="522" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para criar o diretório inicial, utilize o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; /home/horacio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com a pasta inicial do novo usuário criada, é importante que você dê as devidas permissões a ele. Certifique-se de ter privilégios administrativos.&lt;/p&gt;

&lt;p&gt;Use o comando chown para alterar o proprietário e o grupo do diretório &lt;code&gt;/home/horacio&lt;/code&gt; para o usuário "horacio" e seu grupo principal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; horacio:horacio /home/horacio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A opção -R é usada para fazer a alteração recursivamente, o que significa que todos os arquivos e subdiretórios dentro de &lt;code&gt;/home/horacio&lt;/code&gt; também terão suas permissões atualizadas.&lt;/p&gt;

&lt;p&gt;Para garantir que o usuário "horacio" tenha acesso total ao seu diretório pessoal, você pode usar o comando chmod para definir as permissões da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;700 /home/horacio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso definirá as permissões do diretório &lt;code&gt;/home/horacio&lt;/code&gt; para que apenas o proprietário (usuário "horacio") tenha acesso total, enquanto o grupo e outros não têm permissões de leitura, gravação ou execução.&lt;/p&gt;

&lt;p&gt;Depois de executar esses comandos, o diretório &lt;code&gt;/home/horacio&lt;/code&gt; deve estar configurado corretamente com as permissões adequadas para o usuário "horacio" acessar e gerenciar seu próprio espaço pessoal. Feito isso, execute os comandos abaixo para entrar como horacio e criar um arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;su horacio &lt;span class="c"&gt;# Entrar como horacio&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"You Have No Power Here!"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /home/horacio/gandalf-the-gray.txt &lt;span class="c"&gt;# Criar arquivo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotpjrn1ju5tf9f3fsla5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotpjrn1ju5tf9f3fsla5.png" alt="Resultado da criacao do arquivo" width="643" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, tente acessar esse arquivo usando o usuário rosita. Primeiro, entre como rosita e então tente acessar o arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;su rosita &lt;span class="c"&gt;# Entrando como rosita&lt;/span&gt;

&lt;span class="nb"&gt;cat&lt;/span&gt; /home/horacio/gandalf-the-gray.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você deve ver uma mensagem informando que o acesso foi negado, porque rosita não tem permissão para acessar o arquivo de horacio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrcwaq7ckaig614spjt0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrcwaq7ckaig614spjt0.png" alt="Tentando acessar o arquivo de horacio, conectado como rosita" width="643" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando um Grupo
&lt;/h3&gt;

&lt;p&gt;Vamos criar um grupo chamado "dogs", que pode ser útil em um cenário de colaboração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;groupadd dogs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adicionando Permissões ao Grupo
&lt;/h3&gt;

&lt;p&gt;Agora, vamos adicionar permissões ao grupo "dogs" para acessar a pasta do usuário horacio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; :dogs /home/horacio
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;770 /home/horacio
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso permite que todos os membros do grupo "dogs" (ainda não adicionados) acessem a pasta do usuário horacio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adicionando Usuários ao Grupo
&lt;/h3&gt;

&lt;p&gt;Agora, vamos adicionar rosita ao grupo "dogs":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; dogs rosita
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testando as Permissões
&lt;/h3&gt;

&lt;p&gt;Agora que rosita faz parte do grupo "dogs", ela deve ser capaz de acessar a pasta de horacio. Tente acessar o arquivo de exemplo novamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /home/horacio/gandalf-the-gray.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sfp1ye6pl9xyldn81y2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8sfp1ye6pl9xyldn81y2.png" alt="Rosita acessando horacio" width="638" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você deverá conseguir acessar o arquivo sem problemas. Isso demonstra como as permissões de grupo podem controlar o acesso a recursos em um sistema Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações Finais
&lt;/h2&gt;

&lt;p&gt;Com esse artigo você pode ver o quão simples é criar e gerenciar grupos e usuários em um sistema Linux com confiança. Essas habilidades essenciais garantem a segurança, organização e eficiência no controle de acessos. Parabéns por ter chegado até aqui! 🚀🐧&lt;/p&gt;

&lt;h3&gt;
  
  
  Bônus
&lt;/h3&gt;

&lt;p&gt;Para encerrar este artigo, gostaria de mencionar algumas dicas adicionais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;whoami&lt;/code&gt;&lt;/strong&gt;: Use o comando &lt;code&gt;whoami&lt;/code&gt; para descobrir quem está conectado atualmente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;su&lt;/code&gt; para Alterar Usuário&lt;/strong&gt;: O comando &lt;code&gt;su&lt;/code&gt; permite alternar para outro usuário no sistema com a devida permissão.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Permissões&lt;/strong&gt;: O sistema de permissões octal no Linux utiliza números de 3 dígitos para representar as permissões de leitura, gravação e execução em um arquivo ou diretório. Cada dígito representa um conjunto de permissões: o primeiro para o &lt;strong&gt;proprietário&lt;/strong&gt;, o segundo para o &lt;strong&gt;grupo&lt;/strong&gt; e o terceiro para &lt;strong&gt;outros&lt;/strong&gt;. O número "7" concede permissão total (leitura, gravação e execução), "5" concede leitura e execução, "4" concede apenas leitura, "0" nega todas as permissões. Por exemplo, "770" significa permissão total para proprietário e grupo, enquanto nega todas as permissões para outros.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com isso, você pode ter uma boa visão sobre grupos e usuários no Linux, obrigado e até a próxima! 👋&lt;/p&gt;

</description>
      <category>linux</category>
      <category>sysadmin</category>
      <category>devops</category>
    </item>
    <item>
      <title>Como criar um Servidor Web Java Sem Framework</title>
      <dc:creator>Diogo Izele</dc:creator>
      <pubDate>Thu, 20 Apr 2023 01:26:15 +0000</pubDate>
      <link>https://forem.com/diogoizele/como-criar-um-servidor-web-java-sem-framework-21d6</link>
      <guid>https://forem.com/diogoizele/como-criar-um-servidor-web-java-sem-framework-21d6</guid>
      <description>&lt;p&gt;Olá, espero que você esteja bem 😊 Uma das coisas que gosto de fazer ao iniciar meus estudos em uma tecnologia, é entender como as coisas funcionam nos níveis mais básico da ferramenta, ou seja, construir algo sem o auxílio de frameworks. Assim, passo a ter uma boa noção do que é framework e o que é a nativo da ferramente.&lt;/p&gt;

&lt;p&gt;A proposta aqui é criar e configurar o projeto de um servidor backend simples na linguagem Java, que execute no ambiente local e possua uma rota &lt;code&gt;get&lt;/code&gt; que imprima uma mensagem de “Hello, World!” padrão. Ademais, a ideia é codificar o servidor tentando utilizar o nível mais básico e nativo e entender o que cada ferramenta ou configuração altera no projeto.&lt;/p&gt;

&lt;h1&gt;
  
  
  Quais são os pré-requisitos?
&lt;/h1&gt;

&lt;p&gt;Para iniciar, como quero o menor auxílio possível de outras ferramentas, não vou escolher uma IDE JAVA, uma vez que esse software me ajudaria nessa parte de configuração inicial, não me deixando livre para percorrer o caminho das pedras que é meu propósito. Por isso, o editor de texto que estarei usando é o Visual Studio Code.&lt;/p&gt;

&lt;p&gt;A escolha do VS-code não é influenciada por ser o editor que mais gosto 🤐 mas sim por eu precisar de uma ferramenta que me auxilie o mínimo, mas que ainda torne esse processo operacional. Diferente de utilizar um bloco de notas, que não mostra em destaque as palavras chave ou no Vi ou Nano que são editores que rodam no terminal, que eu particularmente tenho dificuldade de navegar entre o código.&lt;/p&gt;

&lt;p&gt;Além do editor de texto, preciso é claro, do JDK. A sigla para Java Development Kit, compreende o conjunto de ferramentas que os desenvolvedores usam para criar aplicativos em Java. Dentro dele estão inclusos o compilador, depuradores, documentadores e outras ferramentas.&lt;/p&gt;

&lt;p&gt;Para saber se você possui o JDK instalado em sua máquina, no terminal execute o comando&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-version&lt;/span&gt;
javac &lt;span class="nt"&gt;-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como saída, você deve ver algo parecido com isso, variando a versão do Java que você instalou. Para este projeto estou usando a versão &lt;strong&gt;&lt;code&gt;11.0.7&lt;/code&gt;&lt;/strong&gt; do Java.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3g2n8903xunkjpaq68vx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3g2n8903xunkjpaq68vx.png" alt="Image description" width="800" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você não tiver o JDK instalado, você pode baixá-lo e instalá-lo a partir do site oficial da Oracle ou do &lt;a href="https://openjdk.org/install/" rel="noopener noreferrer"&gt;OpenJDK&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Familiarizando-se com o Java
&lt;/h1&gt;

&lt;p&gt;Com tudo configurado, vou fazer um pequeno teste criando um arquivo que imprime ”Hello, World!”, compilar e executar através do terminal.&lt;/p&gt;

&lt;p&gt;No diretório do projeto, vou criar a pasta &lt;strong&gt;&lt;code&gt;src&lt;/code&gt;&lt;/strong&gt; onde ficará os arquivos fontes do projeto, e dentro dela, o arquivo &lt;strong&gt;&lt;code&gt;Main.java&lt;/code&gt;&lt;/strong&gt;. Perceba que a extensão do arquivo é &lt;strong&gt;&lt;code&gt;.java&lt;/code&gt;&lt;/strong&gt;, isso indica que se trata de um arquivo fonte, ou seja, o arquivo onde o programador escreverá o código propriamente dito. Dentro desse arquivo estarei criando a classe que leva o mesmo nome, e o método &lt;strong&gt;&lt;code&gt;main&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O método &lt;strong&gt;&lt;code&gt;public static void main(String[] args)&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
em Java é o ponto de entrada para qualquer programa em Java. É o método que é executado primeiro quando você executa um programa Java a partir da linha de comando ou do IDE. Em programação, funções main semelhantes à essa são chamadas de &lt;strong&gt;Entry Point&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Com o código criado, o próximo passo é a compilação. Para isso, através de um terminal, navegue até a pasta do projeto e execute o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;javac src/Main.java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se não apareceu nenhuma saída no terminal, no diretório src se encontra o bytecode do nosso programa em Java. Bytecode é uma forma de representar um programa Java compilado em uma linguagem intermediária que é interpretada pela Java Virtual Machine (JVM).&lt;/p&gt;

&lt;p&gt;Agora, para executar nosso programa utilizamos o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-cp&lt;/span&gt; src Main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O parâmetro &lt;strong&gt;&lt;code&gt;-cp&lt;/code&gt;&lt;/strong&gt; especifica o classpath, ou seja, o caminho onde a JVM deve procurar pelas classes referenciadas pelo programa. Neste caso, estamos especificando que a pasta "src" contém as classes do programa.&lt;/p&gt;

&lt;h1&gt;
  
  
  Hora do show
&lt;/h1&gt;

&lt;p&gt;Com tudo pronto, testado e funcionando, podemos avançar para a parte que de criação do nosso servidor propriamente dito. Para isso teremos que fazer a importação de 3 módulos do Java.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.sun.net.httpserver.HttpServer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A razão pela qual você precisa fazer o import desses módulos é que eles não estão incluídos na biblioteca padrão do Java. A classe &lt;strong&gt;&lt;code&gt;com.sun.net.httpserver.HttpServer&lt;/code&gt;&lt;/strong&gt; pertence à API do servidor HTTP incorporado, que é uma parte do JDK, mas não é incluída por padrão em todos os ambientes de execução do Java. Da mesma forma, as classes &lt;strong&gt;&lt;code&gt;java.io.IOException&lt;/code&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;code&gt;java.net.InetSocketAddress&lt;/code&gt;&lt;/strong&gt; são parte da biblioteca padrão do Java, mas precisam ser importadas porque são usadas no código e não estão no pacote padrão.&lt;/p&gt;

&lt;p&gt;Além disso, mesmo que as classes estejam no pacote padrão, é uma boa prática importá-las explicitamente para deixar o código mais claro e fácil de entender.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;com.sun.net.httpserver.HttpServer&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse é o módulo da API do servidor HTTP incorporado que é fornecido pelo JDK. Essa API permite que você crie um servidor web em Java sem precisar usar uma biblioteca de terceiros ou um servidor web externo. A classe &lt;strong&gt;&lt;code&gt;HttpServer&lt;/code&gt;&lt;/strong&gt; representa o servidor web em si, e é responsável por gerenciar as conexões de entrada e saída, bem como pelo roteamento das solicitações para as classes de manipuladores correspondentes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;java.io.IOException&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este import é necessário para que o servidor HTTP incorporado possa lançar uma exceção de &lt;strong&gt;&lt;code&gt;IOException&lt;/code&gt;&lt;/strong&gt;. Isso acontece porque o servidor precisa criar um (socket) para escutar as conexões de entrada. No entanto, pode haver problemas ao criar o soquete, como falha na conexão, porta em uso ou outro erro. A exceção &lt;strong&gt;&lt;code&gt;IOException&lt;/code&gt;&lt;/strong&gt; é lançada quando ocorre um erro na criação do soquete. Essa exceção é uma exceção verificada, o que significa que o código precisa lidar com ela de alguma forma (como mostrado na resposta anterior).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;java.net.InetSocketAddress&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este import é necessário porque a classe &lt;strong&gt;&lt;code&gt;HttpServer&lt;/code&gt;&lt;/strong&gt; precisa de um objeto &lt;strong&gt;&lt;code&gt;InetSocketAddress&lt;/code&gt;&lt;/strong&gt; para determinar qual porta e endereço IP usar para escutar as conexões de entrada. É por isso que a criação de um objeto &lt;strong&gt;&lt;code&gt;InetSocketAddress&lt;/code&gt;&lt;/strong&gt; é um passo importante na criação de um servidor HTTP incorporado, porque ele especifica onde o servidor web estará "ouvindo" as solicitações HTTP recebidas.&lt;/p&gt;

&lt;p&gt;Repare que até aqui, apenas fizemos os imports necessários para os módulos básicos, disponíveis no JDK, para a criação do nosso servidor web.&lt;/p&gt;

&lt;p&gt;Como já comentado, o módulo de &lt;strong&gt;&lt;code&gt;IOException&lt;/code&gt;&lt;/strong&gt; é importante para lançar uma exceção. No Java, uma Exception é uma classe que representa uma condição excepcional que ocorre durante a execução de um programa. Ao ocorrer um erro, uma instância de uma classe de Exception é criada e lançada, interrompendo a execução normal do programa. As Exceptions permitem que os programas lidem com erros e situações excepcionais de forma mais controlada.&lt;/p&gt;

&lt;p&gt;Por isso, faremos uma pequena alteração no código fonte do servidor utilizando a palavra &lt;strong&gt;&lt;code&gt;throws&lt;/code&gt;&lt;/strong&gt; após a assinatura do nosso entry point. O &lt;strong&gt;&lt;code&gt;throws&lt;/code&gt;&lt;/strong&gt; é uma declaração que informa que um método pode lançar uma exceção durante a sua execução.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.sun.net.httpserver.HttpServer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como próximo passo, devemos criar uma instância que representa o endereço e a porta em que o servidor deve ser executado. Para isso utilizaremos a classe &lt;strong&gt;&lt;code&gt;InetSocketAddress&lt;/code&gt;&lt;/strong&gt;. A classe &lt;strong&gt;&lt;code&gt;InetSocketAddress&lt;/code&gt;&lt;/strong&gt; possui dois construtores que podem ser utilizados para instanciar um objeto. O primeiro deles recebe um objeto do tipo &lt;strong&gt;&lt;code&gt;InetAddress&lt;/code&gt;&lt;/strong&gt; e um número de porta, e o segundo recebe uma string com o endereço IP ou nome do host e um número de porta.&lt;/p&gt;

&lt;p&gt;Aqui está uma explicação mais detalhada de cada um dos parâmetros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;InetAddress&lt;/code&gt;&lt;/strong&gt;: é um objeto que representa um endereço IP. Ele pode ser obtido através da classe &lt;strong&gt;&lt;code&gt;InetAddress&lt;/code&gt;&lt;/strong&gt; do Java. Ao utilizar esse parâmetro, estamos especificando o endereço IP do servidor ou cliente que será utilizado na conexão.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;String&lt;/code&gt;&lt;/strong&gt;: é uma string que representa o endereço IP ou nome do host. Ele é útil quando queremos criar uma instância de &lt;strong&gt;&lt;code&gt;InetSocketAddress&lt;/code&gt;&lt;/strong&gt; a partir de uma string. Por exemplo, se quisermos criar um endereço a partir de uma string "localhost", podemos passar essa string como parâmetro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;int&lt;/code&gt;&lt;/strong&gt;: é um número inteiro que representa a porta que será utilizada na conexão. A porta é utilizada para especificar o canal de comunicação que será utilizado pelo servidor ou cliente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao instanciar um objeto de &lt;strong&gt;&lt;code&gt;InetSocketAddress&lt;/code&gt;&lt;/strong&gt;, precisamos passar esses parâmetros no construtor de acordo com o que desejamos.&lt;/p&gt;

&lt;p&gt;Para deixar mais didático, declarei uma variável do tipo &lt;strong&gt;&lt;code&gt;String&lt;/code&gt;&lt;/strong&gt; com o identificador &lt;strong&gt;&lt;code&gt;host&lt;/code&gt;&lt;/strong&gt; e uma variável do tipo &lt;strong&gt;&lt;code&gt;int&lt;/code&gt;&lt;/strong&gt; com o identificador &lt;strong&gt;&lt;code&gt;port&lt;/code&gt;&lt;/strong&gt;, além de alterar nossa antiga variável chamada &lt;strong&gt;&lt;code&gt;greetings&lt;/code&gt;&lt;/strong&gt; para &lt;strong&gt;&lt;code&gt;response&lt;/code&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.sun.net.httpserver.HttpServer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim a cereja do nosso bolo, a classe responsável por criar o servidor HTTP. A classe &lt;strong&gt;&lt;code&gt;HttpServer&lt;/code&gt;&lt;/strong&gt;, que pode ser usada para criar um servidor HTTP que ouve em uma porta específica e manipula solicitações HTTP de entrada,&lt;/p&gt;

&lt;p&gt;A classe &lt;strong&gt;&lt;code&gt;HttpServer&lt;/code&gt;&lt;/strong&gt; fornece um método estático &lt;strong&gt;&lt;code&gt;create()&lt;/code&gt;&lt;/strong&gt; que cria uma instância do servidor HTTP. O método &lt;strong&gt;&lt;code&gt;create()&lt;/code&gt;&lt;/strong&gt; aceita dois parâmetros: um &lt;strong&gt;&lt;code&gt;InetSocketAddress&lt;/code&gt;&lt;/strong&gt; e um &lt;strong&gt;&lt;code&gt;int&lt;/code&gt;&lt;/strong&gt; que indica o número máximo de solicitações que o servidor pode manipular simultaneamente. Quando o servidor recebe uma solicitação, ele cria uma nova thread para manipular a solicitação e liberar o thread principal para lidar com novas solicitações.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.sun.net.httpserver.HttpServer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

    &lt;span class="nc"&gt;HttpServer&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HttpServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora precisamos criar um contexto para o servidor HTTP, indicando o que deve acontecer quando o servidor receber uma requisição para a rota "/" (root). No contexto de um servidor HTTP, o termo "contexto" se refere a um mapeamento entre uma determinada URL e uma função ou método que deve ser executado para lidar com as requisições feitas para essa URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.sun.net.httpserver.HttpServer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

    &lt;span class="nc"&gt;HttpServer&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HttpServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createContext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{}));&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;server.createContext("/", (exchange -&amp;gt; {...} cria um contexto para a URL raiz ("/") e define uma função lambda para lidar com as requisições feitas para essa URL. O conceito de lambda no Java é uma expressão que representa uma função anônima, que pode ser passada como argumento para um método ou atribuída a uma variável.&lt;/p&gt;

&lt;p&gt;A palavra-chave &lt;strong&gt;&lt;code&gt;exchange&lt;/code&gt;&lt;/strong&gt; representa a troca de informações entre o cliente e o servidor. A função lambda recebe esse objeto &lt;strong&gt;&lt;code&gt;exchange&lt;/code&gt;&lt;/strong&gt; como parâmetro e, a partir dele, é possível acessar e manipular os dados da requisição e da resposta.&lt;/p&gt;

&lt;p&gt;Com o contexto criado precisamos aplicar algumas configurações para definir o formato do conteúdo da resposta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.sun.net.httpserver.HttpServer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

    &lt;span class="nc"&gt;HttpServer&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HttpServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createContext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

      &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getResponseHeaders&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"text/plain"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendResponseHeaders&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getResponseBody&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
      &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}));&lt;/span&gt;

    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro da função lambda, primeiro é definido o tipo do conteúdo da resposta, usando o método &lt;strong&gt;&lt;code&gt;set()&lt;/code&gt;&lt;/strong&gt; do objeto &lt;strong&gt;&lt;code&gt;getResponseHeaders()&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Em seguida, o código envia a resposta ao cliente, indicando o código de status 200 (OK), o tamanho da resposta e o conteúdo em si, usando os métodos &lt;strong&gt;&lt;code&gt;sendResponseHeaders()&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;getResponseBody()&lt;/code&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;code&gt;write()&lt;/code&gt;&lt;/strong&gt; do objeto &lt;strong&gt;&lt;code&gt;exchange&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por fim, o método &lt;strong&gt;&lt;code&gt;close()&lt;/code&gt;&lt;/strong&gt; é chamado para encerrar a troca de informações entre o cliente e o servidor.&lt;/p&gt;

&lt;p&gt;Ao final, precisamos inicializar nosso servidor web. O método &lt;strong&gt;&lt;code&gt;server.start()&lt;/code&gt;&lt;/strong&gt; é responsável por iniciar o servidor HTTP. Após a chamada desse método, o servidor começa a ouvir as solicitações HTTP recebidas na porta e host especificados.&lt;/p&gt;

&lt;p&gt;A última linha, &lt;strong&gt;&lt;code&gt;System.out.println("Servidor iniciado em http://localhost:8080/");&lt;/code&gt;&lt;/strong&gt;, exibe uma mensagem no console informando ao usuário que o servidor foi iniciado com sucesso e em qual URL ele está sendo executado. Essa mensagem é apenas informativa e não interfere no funcionamento do servidor. É uma forma de indicar ao usuário que o servidor está pronto para receber as solicitações.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.sun.net.httpserver.HttpServer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;InetSocketAddress&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

    &lt;span class="nc"&gt;HttpServer&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HttpServer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createContext&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

      &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getResponseHeaders&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"text/plain"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sendResponseHeaders&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getResponseBody&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
      &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}));&lt;/span&gt;

    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Servidor iniciado em http://"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;":"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Considerações finais
&lt;/h1&gt;

&lt;p&gt;Em resumo, esse projeto cria um servidor HTTP simples na porta 8080 e no host "localhost". Quando uma solicitação HTTP get é feita para a URL raiz "/", o servidor responde com o texto "Hello&lt;/p&gt;

&lt;p&gt;World!".&lt;/p&gt;

&lt;p&gt;O método main() é responsável por inicializar o servidor e definir o contexto para a URL raiz "/". Dentro do contexto, é definida uma função lambda que trata a solicitação HTTP recebida. Nessa função, é definido o tipo de conteúdo da resposta como "text/plain", o código de status da resposta como 200 (OK), o corpo da resposta como o texto "Hello World!" e, por fim, a resposta é enviada para o cliente e a conexão é fechada.&lt;/p&gt;

&lt;p&gt;Por fim, o servidor é iniciado e uma mensagem é exibida no console informando a URL em que o servidor está sendo executado.&lt;/p&gt;

&lt;p&gt;Neste artigo, vimos como criar um servidor web Java simples sem o uso de nenhum framework. Com apenas algumas linhas de código, é possível criar um servidor que recebe solicitações HTTP e responde com o conteúdo desejado.&lt;/p&gt;

&lt;p&gt;Embora seja possível criar um servidor web Java sem framework, é importante lembrar que frameworks como Spring e Spark oferecem muitas funcionalidades úteis que podem acelerar o desenvolvimento de um aplicativo web.&lt;/p&gt;

&lt;p&gt;Se você quiser ver o código completo do servidor web Java que criamos neste artigo, confira o meu projeto no GitHub: &lt;a href="https://github.com/diogoizele/pure-java-server" rel="noopener noreferrer"&gt;pure-java-server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Espero que este artigo tenha sido útil e que você tenha aprendido algo novo sobre como criar um servidor web Java simples. Fique à vontade para compartilhar suas ideias e comentários abaixo. Até a próxima! 👋&lt;/p&gt;

</description>
      <category>java</category>
      <category>javac</category>
      <category>webserver</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
