Text Material Preview
8ºAula
Implementação III
Objetivos de aprendizagem
Ao término desta aula, vocês serão capazes de:
• construir o lado do servidor e do cliente de um chat.
Olá,
Esta é a última aula da disciplina Programação para
Dispositivos Móveis. Na aula anterior, uma aplicação
com armazenamento local e remoto foi exemplificada,
demonstrando a facilidade de manutenção em aplicações, cuja
lógica de interface fica separada da lógica de gerenciamento de
dados.
Para encerrar nossa disciplina, será criada uma aplicação
que se conectará a um servidor broadcast através do socket.
Bons estudos!
48Programação para Dispositivos Móveis
Seções de estudo
1– Módulo socket.io Lado do Servidor
2– Módulo socket.io Lado do Cliente
1- Módulo socket.io Lado do Servidor
Aplicações que trocam informações em tempo real
estão cada vez mais presentes no cotidiano, sejam trocas de
mensagens simples como chats ou em trocas de dados mais
complexos como nos jogos on-line.
A forma de se conseguir criar uma aplicação com essas
características é utilizando os Sockets, com ele é possível criar
uma comunicação baseada em eventos, bidirecional, e em
tempo real.
Para funcionar corretamente duas abordagens devem
ser desenvolvidas, representadas na Figura 1, o lado do
servidor que funcionará como um broadcast que retransmite
a mensagem enviada por um cliente para todos os outros, e
o lado do cliente que envia e recebe mensagens do servidor.
Figura 1 – Funcionamento servidor broadcast. Fonte: Acervo pessoal.
O lado do servidor será desenvolvido em Node.js
utilizando os módulos express e Socket.io, o primeiro é
responsável por criar o servidor HTTP. Os módulos devem
ser instalados e importados dentro do arquivo do servidor.
npm install socket.io --save
npm install express --save
const express = require(“express”);
const http = require(“http”);
const socketIo = require(“socket.
io”);
Deve-se então defi nir a porta que será escutada pelo
servidor, executar todas as funções para criação do servidor
http e socket, e colocar o servidor para escutar a porta
escolhida.
const port = process.env.PORT ||
5000;
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
server.listen(port, () => console.
log(`Listening on port ${port}`));
O módulo socket.io é baseado em eventos, o primeiro
evento que pode acontecer com o socket (variável io no
código acima) é o de conexão (connection);
io.on(“connection”, socket => {
console.log(“a user connected :D”);
});
O resultado dessa conexão é o objeto socket que contém
as informações da ligação entre o cliente e servidor. A partir
desse objeto podem ser criadas as funções que escutaram os
eventos que receberam as mensagens. O código abaixo será
criado dentro da função quando o cliente se conectar ao
servidor.
socket.on(“message”, msg => {
console.log(msg);
});
Nesse exemplo, quando o cliente enviar uma mensagem
com a chave “message” essa função é então executada.
Quando é necessário enviar uma mensagem para todos
os clientes conectados o objeto io deve passar a chave que o
cliente irá tratar seguido da mensagem que será enviada.
io.emit(“message”, msg);
Essa função envia para todos os clientes, se o servidor
for retransmitir a mensagem de um cliente ela, nesse caso,
irá também para o próprio cliente que enviou. Para enviar a
mensagem somente para os outros clientes pode-se utilizar a
função abaixo, dentro de uma conexão específi ca.
socket.broadcast.emit(“message”,
msg);
Na documentação do módulo é possível encontrar todas
as funções que podem ser utilizadas.
O código completo para um servidor broadcast é bem
simples e pode ser executado localmente no Node.js ou
utilizar algum servidor (Heroku por exemplo) para subir seu
código.
const express = require(“express”);
const http = require(“http”);
const socketIo = require(“socket.
io”);
const port = process.env.PORT ||
5000;
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
server.listen(port, () => console.
log(`Listening on port ${port}`));
io.on(“connection”, socket => {
49
console.log(“Usuário conectado!”);
socket.on(“message”, msg => {
console.log(msg);
io.emit(“message”, msg);
});
});
2- Módulo socket.io Lado do Cliente
Com o servidor desenvolvido e rodando, agora é preciso
criar o lado do cliente. Utilizando o template básico do React
Native a primeira coisa a se fazer é instalar e importar o
módulo socket.io-client.
npm install socket.io-client
import io from “socket.io-client”;
Para iniciar a conexão com o servidor através do módulo
socket, deve se passar para o objeto io o endereço da máquina
em que o servidor http + websocket está rodando.
const ENDPOINT =
“http://192.168.25.4:5000”;
const socket = io(ENDPOINT);
A interface com o usuário contará com uma InputText
que onde a mensagem será digitada, dois botões: um para
enviar a mensagem para o servidor e outro para limpar as
mensagens que já foram recebidas e as mensagens em si. Tanto
a mensagem digitada na caixa de texto quanto as mensagens
recebidas serão armazenadas nos estados do React Native.
const [message, setMessage] =
useState(“”);
const [messages, setMessages] =
useState([]);
Para receber as mensagens dentro do useEffect que
nesse caso será executado somente uma vez (no início da
execução do app) através do módulo socket as mensagens que
são recebidas são incluídas no array do estado das mensagens.
useEffect(() => {
socket.on(“chat message”, message
=> {
setMessages(oldArray => [...
oldArray, { id: new Date().getTime(),
message: message }]);
});
}, []);
As mensagens serão mapeadas para serem exibidas
sempre que forem recebidas, já que, ao chegar a mensagem,
irá atualizar o estado das mensagens e consequentemente a
renderização da interface será chamada novamente.
menssages.map(message => { return
<Text style={styles.messageText}
key={message.id}>{message.message}</
Text> })}
Os eventos dos botões e do textInput são tratados pelas
funções handleButtonSendPress, handleButtonErasePress e
handleChangeText. Na primeira, quando o botão de enviar
é pressionado a mensagem é enviada através do socket e o
conteúdo do textInput é limpo. No segundo, o estado das
mensagens recebidas é setado com um array vazio, para que
as mensagens sejam “apagadas”. E no último o estado da
mensagem é alterado sempre que o texto do input for alterado.
function handleButtonSendPress() {
socket.emit(‘chat message’,
message);
setMessage(“”);
};
function handleButtonErasePress()
{
setMessages([]);
};
function
handleChangeText(chatMessage){
setMessage(chatMessage);
}
A interface com o usuário e os estilos são apresentados
abaixo, que irão renderizar a tela da Figura 2.
return (
<View style={styles.container}>
<StatusBar style=”light” />
<TextInput
style={{ marginTop: 50,
marginLeft: 30, marginRight: 30, height:
40, borderWidth: 2, backgroundColor:
“white” }}
autoCorrect={false}
value={message}
onChangeText={handleChangeText}
/>
<View style={styles.
buttonsContainer}>
<TouchableOpacity
s t y l e = { s t y l e s . b u t t o n }
onPress={handleButtonSendPress}>
<Text style={styles.
buttonText}>Enviar</Text>
</TouchableOpacity>
<TouchableOpacity
s t y l e = { s t y l e s . b u t t o n }
onPress={handleButtonErasePress}>
<Text style={styles.
buttonText}>Limpar</Text>
</TouchableOpacity>
</View>
{messages.map(message => {
return <Text style={styles.messageText}
key={message.id}>{message.message}</
Text> })}
</View>
);
const styles = StyleSheet.create({
50Programação para Dispositivos Móveis
container: {
height: 400,
fl ex: 1,
backgroundColor: ‘#ccc’,
alignContent: ‘center’
},
buttonsContainer: {
fl exDirection: ‘row-reverse’,
borderBottomWidth: 1,
borderBottomColor:‘#CCC’,
paddingBottom: 10,
marginLeft: 30,
marginTop: 10
},
button: {
marginLeft: 10,
height: 60,
backgroundColor: ‘#036FFC’,
borderRadius: 10,
paddingHorizontal: 24,
fontSize: 16,
alignItems: ‘center’,
justifyContent: ‘center’,
elevation: 20,
shadowOpacity: 20,
shadowColor: ‘#ccc’,
},
buttonText: {
color: ‘#fff’,
fontWeight: ‘bold’,
},
messageText: {
padding: 10,
marginTop: 10,
marginLeft: 30,
marginRight: 30,
fontSize: 16,
backgroundColor: ‘#FFF’,
borderRadius: 10
}
});
Figura 2 – Aplicativo Chat.Fonte: Acervo pessoal.
Da maneira como foi desenvolvido, a aplicação envia a
mensagem para o servidor, que retorna para todos os clientes
(inclusive quem enviou), quando essa mensagem é recebida
de volta, ela é então incluída em um array que mapeia e exibe
as mensagens que vieram do servidor.
E assim encerramos nossas aulas, com uma aplicação
prática de um chat com React Native.
Chegamos ao fi nal da oitava e última aula. Vamos
recordar?
Retomando a aula
1– Módulo socket.io Lado do Servidor
Na seção 1 foi exemplifi cada a criação do lado do servidor
utilizando o socket.io, esse servidor funciona em broadcast
o que signifi ca que toda mensagem que ele receber será
reenviada para todos os clientes que estiverem conectados.
2– Módulo socket.io Lado do Cliente
Na última seção foi demonstrado desde a lógica por trás
da comunicação (recebimento e envio de mensagens) até a
interface e estilos da aplicação.
KRISS. In: Buiding Chat App with React Native
and Socket.io, 2019. Disponível em: https://kriss.
io/buiding-chat-app-with-react-native-and-socketio-
cjzi03e3e005bdes19yy89z7d/. Acesso em: 26 jun. 2020.
GAGLIARDI, V. In: Socket.IO, React and Node.
js: Going Real-Time, 2020. Disponível em: https://www.
valentinog.com/blog/socket-react/. Acesso em: 26 jun.
2020.
Vale a pena acessar
PINHO, D. M.; ESCUDELARIO, B. React Native
Desenvolvimento de aplicativos mobile com React. Editora Casa do
Código, São Paulo, 2020.
EISENMAN, B. Learning React Native: Building Native
Mobile Apps with JavaScript. O’Reilly Media, 2015.
BODUCH, A. React and React Native. Packt Publishing,
2017.
LEBENSOLD, J. React Native Cookbook: Bringing the
Web to Native Platforms. O’Reilly Media, 2018.
Vale a pena ler
Vale a pena
51
Referências
BODUCH, A. React and React Native. Packt Publishing,
2017.
EISENMAN, B. Learning React Native: Building Native
Mobile Apps with JavaScript. O’Reilly Media, 2015.
LEBENSOLD, J. React Native Cookbook: Bringing the
Web to Native Platforms. O’Reilly Media, 2018.
PINHO, D. M.; ESCUDELARIO, B. React Native
Desenvolvimento de aplicativos mobile com React. Editora Casa do
Código, São Paulo, 2020.
Minhas anotações