Rodrigo Branas – @rodrigobranas - http://www.agilecode.com.br
Core Modules - net
É possível interagir com diversos tipos
de protocolos baseados em TCP
HTTP, SMTP, FTP, POP3, IRC e
muitos outros
O TCP, ou Transmission Control Protocol, é um
protocolo da camada de transporte, orientado a
conexão, bidirecional e responsável por controlar
o processo de transmissão de dados.
Trata problemas como a perda, duplicação
e ainda garante a ordenação dos pacotes
Vamos criar um chat com suporte
para múltiplos clientes
Começando pelo servidor
Importando o módulo net
server.js
1. var net = require('net');
Criando um servidor
server.js
1. var net = require('net');
2.
3. net.createServer();
Escutando na porta 3000
server.js
1. var net = require('net');
2.
3. net.createServer().listen(3000);
Criando o cliente
Importando o módulo net
client.js
1. var net = require('net');
Conectando na porta 3000
client.js
1. var net = require('net');
2.
3. net.connect(3000);
Conectando em 127.0.0.1 na porta 3000
client.js
1. var net = require('net');
2.
3. net.connect({host: '127.0.0.1', port: 3000});
Trocando as primeiras mensagens
entre o cliente e o servidor
Enviando uma mensagem para o cliente
server.js
1. var net = require('net');
2.
3. net.createServer(function (connection) {
4. connection.write('Hello, I am the server!');
5. }).listen(3000);
Recebendo uma mensagem do servidor
client.js
1. var net = require('net');
2.
3. var client = net.connect(3000);
4. client.on('data', function (message) {
5. console.log(message.toString());
6. });
Mandando uma mensagem para o servidor
client.js
1. var net = require('net');
2.
3. var client = net.connect(3000);
4. client.on('connect', function () {
5. client.write('Hello, I am the client!');
6. });
7. client.on('data', function (message) {
8. console.log(message.toString());
9. });
Recebendo uma mensagem do cliente
server.js
1. var net = require('net');
2.
3. net.createServer(function (connection) {
4. connection.write('Hello, I am the server!');
5. connection.on('data', function (message) {
6. console.log(message.toString());
7. });
8. }).listen(3000);
Trocando mensagens entre
os clientes
Mandando uma mensagem para o servidor
client.js
1. var net = require('net');
2.
3. var client = net.connect(3000);
4. client.on('data', function (message) {
5. console.log(message.toString());
6. });
7. process.stdin.on('readable', function () {
8. var message = process.stdin.read();
9. if (!message) return;
10. message = message.toString().replace(/n/, '');
11. client.write(message);
12. });
Recebendo uma mensagem do cliente
server.js
1. var net = require('net');
2.
3. net.createServer(function (connection) {
4. connection.on('data', function (message) {
5. console.log(message.toString());
6. });
7. }).listen(3000);
Criando um array de conexões
server.js
1. var net = require('net');
2.
3. var connections = [];
4. net.createServer(function (connection) {
5. connection.on('data', function (message) {
6. console.log(message.toString());
7. });
8. }).listen(3000);
Adicionando as novas conexões ao array
server.js
1. var net = require('net');
2.
3. var connections = [];
4. net.createServer(function (connection) {
5. connections.push(connection);
6. connection.on('data', function (message) {
7. console.log(message.toString());
8. });
9. }).listen(3000);
Fazendo broadcast de cada mensagem
server.js
1. var net = require('net');
2.
3. var connections = [];
4. var broadcast = function (message) {
5. connections.forEach(function (connection) {
6. connection.write(message);
7. });
8. };
9. net.createServer(function (connection) {
10. connections.push(connection);
11. connection.on('data', function (message) {
12. broadcast(message);
13. });
14. }).listen(3000);
Enviando a mensagem apenas para os outros
server.js
1. var net = require('net');
2.
3. var connections = [];
4. var broadcast = function (message, origin) {
5. connections.forEach(function (connection) {
6. if (connection === origin) return;
7. connection.write(message);
8. });
9. };
10. net.createServer(function (connection) {
11. connections.push(connection);
12. connection.on('data', function (message) {
13. broadcast(message, connection);
14. });
15. }).listen(3000);
Identificando cada cliente
Trocando o nickname
server.js
1. var net = require('net');
2.
3. var connections = [];
4. var broadcast = function (message, origin) {
5. connections.forEach(function (connection) {
6. if (connection === origin) return;
7. connection.write(message);
8. });
9. };
10. net.createServer(function (connection) {
11. connections.push(connection);
12. connection.on('data', function (message) {
13. var command = message.toString();
14. if (command.indexOf('/nickname') === 0) {
15. var nickname = command.replace('/nickname ', '');
16. broadcast(connection.nickname + ' is now ' + nickname);
17. connection.nickname = nickname;
18. return;
19. }
20. broadcast(connection.nickname + ' > ' + message, connection);
21. });
22. }).listen(3000);
Encerrando a comunicação entre
o cliente e o servidor
Tratando o encerramento da conexão
client.js
1. var net = require('net');
2.
3. var client = net.connect(3000);
4. client.on('data', function (message) {
5. console.log(message.toString());
6. });
7. client.on('end', function () {
8. process.exit();
9. });
10. process.stdin.on('readable', function () {
11. var message = process.stdin.read();
12. if (!message) return;
13. message = message.toString().replace(/n/, '');
14. client.write(message);
15. });
Tratando o encerramento da conexão
server.js
1. var net = require('net');
2.
3. var connections = [];
4. var broadcast = function (message, origin) {
5. connections.forEach(function (connection) {
6. if (connection === origin) return;
7. connection.write(message);
8. });
9. };
10. net.createServer(function (connection) {
11. connections.push(connection);
12. connection.on('data', function (message) {
13. var command = message.toString();
14. if (command.indexOf('/nickname') === 0) {
15. var nickname = command.replace('/nickname ', '');
16. broadcast(connection.nickname + ' is now ' + nickname);
17. connection.nickname = nickname;
18. return;
19. }
20. broadcast(connection.nickname + ' > ' + message, connection);
21. });
22. connection.on('end', function () {
23. broadcast(connection.nickname + ' has left!', connection);
24. connections.splice(connections.indexOf(connection), 1);
25. });
26. }).listen(3000);
27.
Confira toda a documentação em
https://nodejs.org/api/net.html
Rodrigo Branas
Agile Code: http://www.agilecode.com.br
Twitter: @rodrigobranas
SlideShare: http://www.slideshare.com/rodrigobranas
YouTube: http://www.youtube.com/rodrigobranas
LinkedIn: http://br.linkedin.com/in/rodrigobranas
+Plus: https://plus.google.com/+RodrigoBranas
GitHub: http://www.github.com/rodrigobranas

Node.js - #6 - Core Modules - net - Rodrigo Branas

  • 1.
    Rodrigo Branas –@rodrigobranas - http://www.agilecode.com.br Core Modules - net
  • 2.
    É possível interagircom diversos tipos de protocolos baseados em TCP
  • 3.
    HTTP, SMTP, FTP,POP3, IRC e muitos outros
  • 4.
    O TCP, ouTransmission Control Protocol, é um protocolo da camada de transporte, orientado a conexão, bidirecional e responsável por controlar o processo de transmissão de dados.
  • 5.
    Trata problemas comoa perda, duplicação e ainda garante a ordenação dos pacotes
  • 6.
    Vamos criar umchat com suporte para múltiplos clientes
  • 7.
  • 8.
    Importando o módulonet server.js 1. var net = require('net');
  • 9.
    Criando um servidor server.js 1.var net = require('net'); 2. 3. net.createServer();
  • 10.
    Escutando na porta3000 server.js 1. var net = require('net'); 2. 3. net.createServer().listen(3000);
  • 11.
  • 12.
    Importando o módulonet client.js 1. var net = require('net');
  • 13.
    Conectando na porta3000 client.js 1. var net = require('net'); 2. 3. net.connect(3000);
  • 14.
    Conectando em 127.0.0.1na porta 3000 client.js 1. var net = require('net'); 2. 3. net.connect({host: '127.0.0.1', port: 3000});
  • 15.
    Trocando as primeirasmensagens entre o cliente e o servidor
  • 16.
    Enviando uma mensagempara o cliente server.js 1. var net = require('net'); 2. 3. net.createServer(function (connection) { 4. connection.write('Hello, I am the server!'); 5. }).listen(3000);
  • 17.
    Recebendo uma mensagemdo servidor client.js 1. var net = require('net'); 2. 3. var client = net.connect(3000); 4. client.on('data', function (message) { 5. console.log(message.toString()); 6. });
  • 18.
    Mandando uma mensagempara o servidor client.js 1. var net = require('net'); 2. 3. var client = net.connect(3000); 4. client.on('connect', function () { 5. client.write('Hello, I am the client!'); 6. }); 7. client.on('data', function (message) { 8. console.log(message.toString()); 9. });
  • 19.
    Recebendo uma mensagemdo cliente server.js 1. var net = require('net'); 2. 3. net.createServer(function (connection) { 4. connection.write('Hello, I am the server!'); 5. connection.on('data', function (message) { 6. console.log(message.toString()); 7. }); 8. }).listen(3000);
  • 20.
  • 21.
    Mandando uma mensagempara o servidor client.js 1. var net = require('net'); 2. 3. var client = net.connect(3000); 4. client.on('data', function (message) { 5. console.log(message.toString()); 6. }); 7. process.stdin.on('readable', function () { 8. var message = process.stdin.read(); 9. if (!message) return; 10. message = message.toString().replace(/n/, ''); 11. client.write(message); 12. });
  • 22.
    Recebendo uma mensagemdo cliente server.js 1. var net = require('net'); 2. 3. net.createServer(function (connection) { 4. connection.on('data', function (message) { 5. console.log(message.toString()); 6. }); 7. }).listen(3000);
  • 23.
    Criando um arrayde conexões server.js 1. var net = require('net'); 2. 3. var connections = []; 4. net.createServer(function (connection) { 5. connection.on('data', function (message) { 6. console.log(message.toString()); 7. }); 8. }).listen(3000);
  • 24.
    Adicionando as novasconexões ao array server.js 1. var net = require('net'); 2. 3. var connections = []; 4. net.createServer(function (connection) { 5. connections.push(connection); 6. connection.on('data', function (message) { 7. console.log(message.toString()); 8. }); 9. }).listen(3000);
  • 25.
    Fazendo broadcast decada mensagem server.js 1. var net = require('net'); 2. 3. var connections = []; 4. var broadcast = function (message) { 5. connections.forEach(function (connection) { 6. connection.write(message); 7. }); 8. }; 9. net.createServer(function (connection) { 10. connections.push(connection); 11. connection.on('data', function (message) { 12. broadcast(message); 13. }); 14. }).listen(3000);
  • 26.
    Enviando a mensagemapenas para os outros server.js 1. var net = require('net'); 2. 3. var connections = []; 4. var broadcast = function (message, origin) { 5. connections.forEach(function (connection) { 6. if (connection === origin) return; 7. connection.write(message); 8. }); 9. }; 10. net.createServer(function (connection) { 11. connections.push(connection); 12. connection.on('data', function (message) { 13. broadcast(message, connection); 14. }); 15. }).listen(3000);
  • 27.
  • 28.
    Trocando o nickname server.js 1.var net = require('net'); 2. 3. var connections = []; 4. var broadcast = function (message, origin) { 5. connections.forEach(function (connection) { 6. if (connection === origin) return; 7. connection.write(message); 8. }); 9. }; 10. net.createServer(function (connection) { 11. connections.push(connection); 12. connection.on('data', function (message) { 13. var command = message.toString(); 14. if (command.indexOf('/nickname') === 0) { 15. var nickname = command.replace('/nickname ', ''); 16. broadcast(connection.nickname + ' is now ' + nickname); 17. connection.nickname = nickname; 18. return; 19. } 20. broadcast(connection.nickname + ' > ' + message, connection); 21. }); 22. }).listen(3000);
  • 29.
    Encerrando a comunicaçãoentre o cliente e o servidor
  • 30.
    Tratando o encerramentoda conexão client.js 1. var net = require('net'); 2. 3. var client = net.connect(3000); 4. client.on('data', function (message) { 5. console.log(message.toString()); 6. }); 7. client.on('end', function () { 8. process.exit(); 9. }); 10. process.stdin.on('readable', function () { 11. var message = process.stdin.read(); 12. if (!message) return; 13. message = message.toString().replace(/n/, ''); 14. client.write(message); 15. });
  • 31.
    Tratando o encerramentoda conexão server.js 1. var net = require('net'); 2. 3. var connections = []; 4. var broadcast = function (message, origin) { 5. connections.forEach(function (connection) { 6. if (connection === origin) return; 7. connection.write(message); 8. }); 9. }; 10. net.createServer(function (connection) { 11. connections.push(connection); 12. connection.on('data', function (message) { 13. var command = message.toString(); 14. if (command.indexOf('/nickname') === 0) { 15. var nickname = command.replace('/nickname ', ''); 16. broadcast(connection.nickname + ' is now ' + nickname); 17. connection.nickname = nickname; 18. return; 19. } 20. broadcast(connection.nickname + ' > ' + message, connection); 21. }); 22. connection.on('end', function () { 23. broadcast(connection.nickname + ' has left!', connection); 24. connections.splice(connections.indexOf(connection), 1); 25. }); 26. }).listen(3000); 27.
  • 32.
    Confira toda adocumentação em https://nodejs.org/api/net.html
  • 33.
    Rodrigo Branas Agile Code:http://www.agilecode.com.br Twitter: @rodrigobranas SlideShare: http://www.slideshare.com/rodrigobranas YouTube: http://www.youtube.com/rodrigobranas LinkedIn: http://br.linkedin.com/in/rodrigobranas +Plus: https://plus.google.com/+RodrigoBranas GitHub: http://www.github.com/rodrigobranas