F P
Fundamentos da comunicação de dados em rede Plano de desenvolvimento da aplicação 12
(conceitos gerais) 7 Projeto(estrutura) do programa 18
I R
Introdução 5 Relatório com linhas de código 19
O
Objetivo do trabalho 4
Objetivo do trabalho
Comunicação de dados
d) Meio: é o caminho físico por onde viaja uma mensagem dirigida ao receptor;
TIPOS DE TRANSMISSÃO
Sinais Elétricos
Os sinais elétricos são tensões que variam ao longo do tempo, sendo que
algumas delas são úteis, pois transmitem alguns tipos de dados, como os que
trafegam nas redes de computadores.
Essas tensões podem ser classificadas como sinais analógicos e digitais.
Sinais Digitais
A grande maioria dos sinais elétricos utilizados na computação são digitais,
e os que são analógicos são digitalizados para que depois sejam processados e
armazenados.
Os sinais digitais assumem uma infinidade de valores, mas não são
matematicamente perfeitos, por isso eles não representam apenas dois valores 0 e
1, como alguns textos ensinam. Como exemplo, em uma transmissão de uma
sequência de bits 0110111001 são usadas as tensões de + 12 volts e – 12 volts para
representar os bits 0 e 1, só que elas não assumem valores exatos, acontecendo
oscilações e em vez de + 12 volts , temos + 11,3 volts ou 12,20 volts. Além dessas
oscilações, o sinal pode sofrer ruídos e interferências, problema que não prejudica a
qualidade do sinal se o valor não for muito acentuado.
O modelo OSI
Para facilitar a interconexão de sistemas de computadores, a ISO
(International Standards Organization) desenvolveu um modelo de referência
chamado OSI (Open Systems Interconnection), para que fabricantes pudessem criar
protocolos a partir desse modelo.
Camadas do modelo OSI
O modelo de referência OSI é o método para descrever como os conjuntos
interconectados de hardware e software de rede podem ser organizados para que
trabalhem concomitantemente no mundo das redes. Com efeito, o modelo OSI
oferece um modo de dividir arbitrariamente a tarefa da rede em pedaços separados,
que estão sujeitos ao processo formal de padronização.
Para fazer isso, o modelo de referência OSI descreve sete camadas de
funções de rede, conforme podemos ver na figura abaixo:
Camada Descrição
Esta camada pega os quadros enviados pela camada de enlace e
Físico os transforma em sinais compatíveis com o meio por onde os
dados deverão ser transmitidos
A camada de enlace pega os pacotes de dados recebidos da
camada de rede e os transforma em quadros que trafegarão pela
Enlace de rede, adicionando informações como o endereço da placa de rede
Dados de origem, o endereço da placa de rede de destino, os dados de
controle, os dados em si e a checagem de redundância cíclica
(CRC).
É responsável pelo endereçamento dos pacotes, convertendo
Rede endereços lógicos em endereços físicos, de forma que os pacotes
consigam chegar corretamente ao destino.
Esta camada é responsável por pegar os dados enviados pela
Transporte camada de sessão e dividi-los em pacotes que serão transmitidos
à camada de rede.
A camada de sessão permite que duas aplicações em
Sessão computadores diferentes estabeleçam uma sessão de
comunicação.
A camada de apresentação converte o formato do dado recebido
Apresentaçã
pela camada de aplicação em um formato comum a ser usado na
o
transmissão desse dado
A camada de aplicação faz a interface entre o protocolo de
Aplicação comunicação e o aplicativo que pediu ou receberá a informação
através da rede
O modelo TCP/IP
O modelo de referência mais conhecido é o TCP/IP (Transmisson Control
Protocol / Internet Protocol). O modelo TCP/IP foi projetado em quatro camadas
Camada Descrição
Esta camada, de acesso à rede, é a primeira do modelo TCP/IP, sua
Camada função é dar suporte à camada de rede, através dos serviços de acesso
físico e lógico ao meio físico
O nível inter-rede (Internet) é o responsável pelo envio dos datagramas
Inter-rede
de um computador qualquer para o outro computador, independente de
(Internet)
suas localizações na rede.
A camada de transporte é responsável por prover suporte à camada de
Transporte aplicação de maneira confiável (ou não), independente dos serviços
oferecidos pelas camadas de interface de rede e inter-rede.
A quarta camada do modelo TCP/IP é denominada de camada de
Aplicação aplicação. Nesta camada, estão os protocolos que dão suporte às
aplicações dos usuários.
Protocolo de comunicação de dados
Protocolo é a “linguagem” usada pelos dispositivos de uma rede de modo
que eles consigam se entender, isto é, trocar informações entre si. Um protocolo é
um conjunto de regras que governa a comunicação de dados
Exemplos de protocolos são: HTTP – Hyper Text Transfer Protocol; SMTP –
Simple Mail Transfer Protocol; FTP – File Transfer; SNMP – Simple NetWork
Management Protocol; DNS – Domain Name Server; TCP – Transmission Control
Protocol; UDP – User Datagram Protocol e IP – Internet Protocol
Plano de desenvolvimento da aplicação
JSON
Uma array é uma coleção de valores ordenados. O array começa com [ (conchete de
abertura) e termina com ] (conchete de fechamento). Os valores são separados por ,
(vírgula).
Um valor (value) pode ser uma cadeia de caracteres (string), ou um número, ou true
ou false, ou null, ou um objeto ou uma array. Estas estruturas podem estar
aninhadas.
Uma string é uma coleção de nenhum ou mais caracteres Unicode, envolvido entre
aspas duplas usando barras invertidas como caracter de escape. Um caracter está
representando como um simples caracter de string. Uma cadeia de caracteres é
parecida com uma cadeia de caracteres em C ou Java.
SQL
Usamos um banco de dados relacional SQL para realizar o cadastro de usuários que
iriam se conectar ao sistema. Structured Query Language, ou Linguagem de
Consulta Estruturada ou SQL, é a linguagem de pesquisa declarativa padrão para
banco de dados relacional (base de dados relacional).
MongoDB
JavaScript
HTML
https://github.com/GCastilho/unip-aps-5s
Api.java:
package api;
import org.bson.Document;
import org.json.JSONObject;
import org.json.JSONArray;
import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import database.DatabaseConnection;
import database.MongoConnection;
class Api {
static JSONObject process(JSONObject data) {
System.out.println("Message: " + data.toString());
JSONObject response = new JSONObject();
commands.put("send", () -> {
String sender = data.getString("userID");
String receiver = data.getString("receiver");
String message = data.getString("message");
if (sender.equals(receiver)) {
commands.get("badRequest").run(); return; }
try {
JSONObject mail = new JSONObject();
mail.put("status", "ok");
mail.put("command", "newMessage");
mail.put("sender", sender);
mail.put("message", message);
mail.put("timestamp", data.get("timestamp"));
if (DatabaseConnection.isGroup(receiver)) {
DatabaseConnection.getGroupUserList(receiver)
.forEach(user -> {
try{
ServerSocketHandler.send(user, mail.toString());
} catch (IOException e) {
e.printStackTrace();
}
});
} else {
ServerSocketHandler.send(receiver,
mail.toString());
}
MongoConnection.addMessage(messageDoc, sender,
receiver);
} catch (Exception e) {
e.printStackTrace();
commands.get("internalServerError").run();
}
});
commands.put("getMessages", () -> {
try {
response.put("status", "ok");
response.put("command", "getMessages");
String sender = data.getString("userID");
String receiver = data.getString("receiver");
List<Document> messageBatch;
if (data.has("lastID")) {
String lastID = data.getString("lastID");
messageBatch =
MongoConnection.getMessageBatch(lastID, sender, receiver);
} else {
messageBatch =
MongoConnection.getMessageBatch("0", sender, receiver);
}
JSONArray messageList = new JSONArray();
messageBatch.forEach(message -> messageList.put(new
JSONObject(message.toJson())));
response.put("messageList", messageList);
} catch (Exception e) {
e.printStackTrace();
commands.get("internalServerError").run();
}
});
commands.put("getChatList", () -> {
try {
response.put("status", "ok");
response.put("command", "getChatList");
List<String> userList =
DatabaseConnection.getUserList();
List<String> groupsList =
DatabaseConnection.getUserGroupList(data.getString("userID"));
commands.put("getChatUserList", () -> {
try {
String user = data.getString("userID");
response.put("status", "ok");
response.put("command", "getUserChatList");
response.put("userList", new
JSONArray(DatabaseConnection.getUserGroupList(user)));
} catch (Exception e) {
e.printStackTrace();
commands.get("internalServerError").run();
}
});
commands.put("addNewGroup", () -> {
try {
String group = data.getString("groupName");
JSONArray arrJson = data.getJSONArray("users");
String[] users = new String[arrJson.length()];
for(int i = 0; i < arrJson.length(); i++) {
users[i] = arrJson.getString(i);
}
response.put("status", "ok");
response.put("command", "addNewGroup");
response.put("group",group);
response.put("users",users);
DatabaseConnection.createGroup(group,users);
} catch (Exception e) {
e.printStackTrace();
commands.get("internalServerError").run();
}
});
commands.put("addUserToGroup", () -> {
try {
String group = data.getString("groupName");
String user = data.getString("user");
response.put("status", "ok");
response.put("command", "addUserToGroup");
response.put("user",user);
DatabaseConnection.addGroupUser(group,user);
} catch (Exception e) {
e.printStackTrace();
commands.get("internalServerError").run();
}
});
commands.put("removeUserFromGroup", () -> {
try {
String group = data.getString("groupName");
String user = data.getString("user");
response.put("status", "ok");
response.put("command", "addGroup");
response.put("user",user);
DatabaseConnection.removeGroupUser(group,user);
} catch (Exception e) {
e.printStackTrace();
commands.get("internalServerError").run();
}
});
commands.put("getGroupUsers", () -> {
try {
String group = data.getString("groupName");
response.put("status", "ok");
response.put("command", "addGroup");
DatabaseConnection.getGroupUserList(group);
response.put("user",DatabaseConnection.getGroupUserList(group));
} catch (Exception e) {
e.printStackTrace();
commands.get("internalServerError").run();
}
});
// Comandos de erro
commands.put("commandNotFound", () -> {
response.put("status", "error");
response.put("info", "Command not found");
});
commands.put("badRequest", () -> {
response.put("status", "error");
response.put("info", "Bad request");
});
commands.put("internalServerError", () -> {
response.put("status", "error");
response.put("info", "Internal server error");
});
if (data.has("command")) {
commands.getOrDefault(data.getString("command"),
commands.get("commandNotFound")).run();
} else {
commands.get("badRequest").run();
}
return response;
}
}
ServerSocketHandler.java:
package api;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import database.DatabaseConnection;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketError;
import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage;
import org.eclipse.jetty.websocket.api.annotations.WebSocket;
import org.json.JSONObject;
import javax.xml.crypto.Data;
@WebSocket
public class ServerSocketHandler {
private final static HashMap<String, ServerSocketHandler> sockets = new
HashMap<>();
private Session session = null;
private String userID = null;
private String sessionID = null;
@OnWebSocketClose
public void onClose(Session session, int statusCode, String reason) {
System.out.println("Close: statusCode: " + statusCode + ", reason: " +
reason);
@OnWebSocketError
public void onError(Throwable t) {
System.out.println("Error: " + t.getMessage());
}
@OnWebSocketConnect
public void onConnect(Session session) {
// save session so we can send
this.session = session;
System.out.println("Connect: " +
session.getRemoteAddress().getAddress());
@OnWebSocketMessage
public void onMessage(String message) throws Exception {
JSONObject jsonMessage = new JSONObject(message);
response.put("status", "ok");
response.put("info", "greetings");
} catch (SQLException e) {
response.put("status", "error");
response.put("command", "response");
response.put("info", "Internal server error");
} catch (Exception e) {
response.put("status", "error");
response.put("command", "response");
response.put("info", e.getMessage());
}
} else {
response.put("status", "error");
response.put("info", "Not logged in");
}
} else {
if (DatabaseConnection.validCookie(this.sessionID)) {
DatabaseConnection.updateCookie(this.sessionID);
jsonMessage.put("userID", userID);
response = Api.process(jsonMessage);
} else {
response.put("status", "error");
response.put("info", "Not logged in");
}
}
if (!response.isEmpty()) this.sendClient(response.toString());
}