-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
91 lines (76 loc) · 3.07 KB
/
server.js
File metadata and controls
91 lines (76 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
const net = require("net");
const readLine = require("readline");
//Define as Variaveis
let Clients = []; // Array de clientes que irão se conectar
let AddressIpServer = ""; // Armazena o Ip
let AddressPortServer = ""; // Armazena a Porta
// Criação da interface de entrada e saida de dados no terminal
const rl = readLine.createInterface({
input: process.stdin,
output: process.stdout
});
// Configurações do servidor e ações quando receber um novo usuário
const handleConnetion = async socket => {
socket.name = socket.remoteAddress + ":" + socket.remotePort; // armazena os dados em socket para identificar o cliente
Clients.push(socket); // adiciona o cliente no array
broadcast(socket.name + " Conectou no Chat"); // da um broadcast para informar que um cliente novo esta conectado
socket.setEncoding("utf8"); //padroniza a entrada do teclado
// recebe os dados dos clientes
socket.on("data", function(data) {
broadcast(data.toString(), socket);
});
// captura as conecções e as mantém - para questões de eventuais erros no socket
server.getConnections(function(err, count) {
console.log(socket.name + count);
});
// remove o cliente do array quando sai da conversa e da um broadcast informando aos demais
socket.on("end", function() {
Clients.splice(Clients.indexOf(socket), 1); // remove do array
broadcast(socket.name + " > Deixou a conversa.\n", socket);
});
// percorre o array de clientes e recebe os parametros que são as mensagens e o cliente. E somente envia a mensagem para o cliente que não é seu rementente
function broadcast(message, sender) {
Clients.forEach(function(client) {
// Tratamento para nao enviar a mesma mensagem a quem originou
if (client === sender) return;
client.write(message);
});
// Envia a mensagem na console
process.stdout.write(message + "\n");
}
};
// passa a as convigurações para o servidor e o cria
const server = net.createServer(handleConnetion);
// Inicio Da leitura
function ask(questionText) {
return new Promise((resolve, reject) => {
rl.question(questionText, input => resolve(input));
});
}
// cria um assincronismo da para a leitura na ordem apresentada dos dados
async function questions() {
AddressIpServer = await ask("INFORME O IP DE SUA MAQUINA: ");
AddressPortServer = await ask("INFORME A PORTA: ");
}
// segunda parte das configurações do servidor para que possa receber as mensagens, passando endereço de porta e ip
function set_server(IPServer, PortServer) {
if (IPServer && PortServer) {
server.listen(PortServer, IPServer);
// caso a porta esteja em uso
server.on("error", function(e) {
if (e.code == "EADDRINUSE") {
console.log("Endereço sendo usado, carregando...");
setTimeout(function() {
server.close();
server.listen(PortServer, IPServer);
}, PortServer);
}
});
}
}
// função assincrona para rodas as funções na ordem desejada.
async function load_server() {
await questions();
await set_server(AddressIpServer, AddressPortServer);
}
load_server();