13/03/2026
Apache com SSL: servidor web seguroConfigurar Apache no Ubuntu e ativar HTTPS com certificado SSL para hospedar sites e apps.
Artigos
Artigos · 13/10/2023
Arquitetura e implementação de chat em tempo real com Socket.IO entre backend Node e app React Native.
Local do chat para estudos D:\Projects\Area_51\ChatDoc

A arquitetura de um sistema de chat pode variar dependendo de diversos fatores, como escopo, requisitos, plataforma e complexidade. No entanto, vou fornecer uma visão geral de uma arquitetura típica para um chat online, considerando os principais componentes e como eles interagem. Essa arquitetura pode ser aplicada a sistemas de chat individuais, aplicativos de mensagens em grupo ou até mesmo serviços de chat em empresas.
Clientes:
Servidor de Chat:
Banco de Dados:
Notificações:
Load Balancer:
Esta é uma arquitetura simplificada e genérica de um sistema de chat. A complexidade pode aumentar dependendo dos recursos específicos oferecidos pelo sistema, como videochamadas, compartilhamento de arquivos, bots ou integrações com outros serviços. Além disso, o dimensionamento e a redundância podem ser necessários para lidar com um grande número de usuários e garantir a disponibilidade contínua do serviço.
Em resumo, nossa solução para comunicação simultânea utilizará as seguintes tecnologias:

Essa arquitetura, baseada em tecnologias modernas e amplamente adotadas, proporcionará uma experiência de chat eficiente e em tempo real para os usuários, além de permitir o armazenamento seguro e acessível do histórico de mensagens.
Nesta abordagem simplificada, você está construindo uma versão básica de chat que permite que todos os usuários se comuniquem em uma única sala de chat. Essa é uma ótima maneira de aprender os conceitos básicos de comunicação em tempo real usando Socket.io e criar um chat funcional com o mínimo de complexidade. Mais recursos e melhorias podem ser adicionados posteriormente, à medida que você se familiariza mais com o desenvolvimento de chat e suas necessidades específicas.
Neste projeto mais simplificado, não incluiremos o desenvolvimento de um banco de dados para armazenar as mensagens, nem a funcionalidade de notificações push para o caso em que um usuário não esteja ativamente no chat. No entanto, forneceremos uma estrutura básica que permite a implementação de notificações push, caso você deseje adicionar esse recurso posteriormente.
Para começar, vamos criar um aplicativo que nomearei 'app-chat'
npx create-expo-app app-chatAgora, vamos começar configurando o nosso back-end. Fora da pasta do aplicativo, vamos criar uma nova pasta para nossos arquivos de servidor, e em seguida, executaremos o comando 'init'. Utilizaremos o comando 'npm init' para criar um arquivo 'package.json' que servirá como o ponto de partida para o nosso projeto.
npm initAlgumas perguntas serão feitas
package name: (server) com.chat.doc version: (1.0.0) description: Server Chat entry point: (index.js) test command: git repository: keywords: author: license: (ISC)
resultando nessas especificações
{
"name": "com.chat.doc",
"version": "1.0.0",
"description": "Server Chat",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Samuel Lisboa",
"license": "ISC"
}Agora, demos início a tudo. Em primeiro lugar, vamos configurar o servidor que irá controlar todas as salas que você, como desenvolvedor, pode criar, seja por meio de IDs ou nomes de usuários. Neste momento, criaremos uma sala com o nome do usuário para nossos testes (no entanto, lembre-se de que em um ambiente de produção real, essa abordagem não é recomendada).
Vamos instalar algumas libs, que serão usadas para comunicacao do chat.
yarn add express socket.io httpConfigurando a Base do Nosso Servidor de Chat
io.on("connection", (socket)=>{
console.log("User connect => ", socket.id);
socket.on('join_room', (room)=>{
socket.join(room);
console.log("User em room ", room);
});
socket.on("send_message", (message)=>{
console.log("Send Mensage", message);
var room = message.room;
const usersInRoom = io.sockets.adapter.rooms.get(room);
if (usersInRoom) {
const numberOfUsers = usersInRoom.size;
console.log(`Número de usuários na sala ${room}: ${numberOfUsers}`);
} else {
console.log(`Nenhum usuário na sala ${room}`);
}
io.to(room).emit("new_message",{...message, id: new Date().getTime()})
});
socket.on("disconnect", ()=>{
console.log("User close", socket.id);
})
})io.on("connection", (socket) => { ... }:socket representa a conexão do usuário recém-conectado.console.log("User connect => ", socket.id);:socket.on('join_room', (room) => { ... }:socket.join(room);:console.log("User em room ", room);:socket.on("send_message", (message) => { ... }:console.log("Send Mensage", message);:var room = message.room;:const usersInRoom = io.sockets.adapter.rooms.get(room);:if (usersInRoom) { ... }:io.to(room).emit("new_message", { ... }):socket.on("disconnect", () => { ... }:instalar LIB
yarn add socket.io-clientPagina principal do chat
import { useEffect, useRef, useState } from "react";
import { io } from "socket.io-client";
import { FlatList, HStack, KeyboardAvoidingView, Text, VStack, View } from "native-base";
import { Platform } from "react-native";
import { TouchableOpacity} from "react-native";
import { Ionicons } from '@expo/vector-icons';
import NewMessageFrom from "./components/NewMessageFrom/NewMessageFrom";
import Message from "./components/Message/Message";
const socket = io('http://192.168.0.108:8801');
export default function Chat() {
var room = "ID_ROOM";
const flatListRef = useRef();
const [messages, setMessages] = useState([]);
const [userName, setuserName] = useState('user_'+new Date().getSeconds());
async function received() {
try{
socket.emit("join_room", room);
socket.on("new_message", (data) => {
console.log('message recive', data);
setMessages(current => {
return [...current, data]
});
setTimeout(()=>{
try{
flatListRef.current.scrollToEnd({ animated: true });
}catch(e){
}
},500);
});
}catch(e){
console.log("Erro in get mensagens live: ",e);
}
}
useEffect(() => {
received();
}, []);
const renderItem = ({ item }) => {
return <Message username={userName} message={item}></Message>
}
return (
<View width={"100%"} height={"100%"}>
<KeyboardAvoidingView
behavior={Platform.OS === "ios" ? 'padding' : null}
>
<VStack width={"100%"} height={"100%"}>
<HStack height={'70px'} background={"#9d002f"} paddingTop={6}>
<Text color={"#FFF"} fontSize={22}> Chat</Text>
</HStack>
<View flex={10} padding={3}>
<FlatList
ref={flatListRef}
data={messages}
renderItem={renderItem}
keyExtractor={item => item.id}
/>
</View>
<View height={'50px'}>
<NewMessageFrom userName={userName} socket={socket} room={room}/>
</View>
</VStack>
</KeyboardAvoidingView>
</View>)
}const socket = io('http://192.168.0.108:8801');: Aqui, você cria uma instância do cliente Socket.io para se conectar a um servidor de chat. O URL 'http://192.168.0.108:8801' deve apontar para o servidor Socket.io.flatListRef é usada para acessar o componente FlatList para rolar para o final da lista de mensagens.received Function:room.useEffect Hook:useEffect é usado para executar a função received quando o componente é montado. Isso garante que os ouvintes de eventos Socket.io estejam prontos para receber mensagens.renderItem Function:FlatList, e um componente 'NewMessageFrom' para que os usuários possam enviar novas mensagens.NewMessageFrom é um componente externo que permite aos usuários enviar novas mensagens. É renderizado na parte inferior da tela.Em resumo, esse código cria a estrutura básica de um aplicativo de chat com uma interface de usuário que exibe mensagens em uma lista e permite aos usuários enviar novas mensagens. Ele também estabelece a comunicação em tempo real com um servidor Socket.io para receber e enviar mensagens. O aplicativo é configurado para ingressar em uma sala de chat específica identificada por room.
Minha preferência é trabalhar com Native-Base, por isso o integrei ao projeto. No entanto, se preferir, você também pode optar por utilizar o React Native puro. Caso deseje instalar o Native-Base, siga a documentação oficial; no entanto, para facilitar, vou fornecer abaixo alguns comandos para uma instalação mais simples."
yarn add native-base
npx expo install react-native-svg@12.1.1
npx expo install react-native-safe-area-context@3.3.2Tudo instalado e programado. Agora, vamos fazer o build do projeto.
npx expo run:android
Agora que o projeto está configurado e programado, estamos prontos para criar o aplicativo de chat em tempo real. Este é um passo significativo na jornada de desenvolvimento e nos permite ver o chat em ação, enviando e recebendo mensagens em tempo real.
Com as bases estabelecidas, podemos continuar aprimorando e adicionando recursos ao aplicativo de chat conforme necessário. É um passo emocionante em direção à criação de uma plataforma de comunicação em tempo real eficaz.

13/03/2026
Apache com SSL: servidor web seguroConfigurar Apache no Ubuntu e ativar HTTPS com certificado SSL para hospedar sites e apps.

20/02/2026
Quando o sinal de celular não dá conta: LoRaLoRa como alternativa de longo alcance quando não há cobertura celular — ideia simples e casos de uso.

13/12/2025
Integrando o Google Maps no Angular 18Usar @angular/google-maps, chave de API e mapa no Angular 18 a partir de um projeto real.