Anda di halaman 1dari 36

BRUNA DE JESUS RAMOS CNTHIA VALERIANO BARBOSA ELVIS QUIRINO VICTORIA HELENA BARBANERA

RA: A5430H1 RA: A3378B1 RA: A514236 RA: A474BD8

DESENVOLVIMENTO DE UMA FERRAMENTA PARA COMUNICAO EM REDE

CINCIA DA COMPUTAO

CAMPINAS 2012

ndice

OBJETIVO E MOTIVAO DO TRABALHO ....................................................... 3 INTRODUO ..................................................................................................... 4 CONCEITOS GERAIS .......................................................................................... 6 DESENVOLVIMENTO .......................................................................................... 10 PROJETO............................................................................................................. 16 RELATRIO CDIGO FONTE ......................................................................... 17 REFERNCIAS BIBLIOGRFICAS .................................................................... 31 FICHA DE ATIVIDADES PRTICAS SUPERVISIONADAS................................. 33

Objetivo

A comunicao superior sociedade humana. Devido a ocupao de espaos geogrficos distantes, a necessidade de se comunicar a longa distncia se tornou intensa. Devido o aparecimento de novas tecnologias, a comunicao em rede referese transferncia de informaes. Para isso, usam-se protocolos que so linguagens usadas para transferir dados pela rede, atravs de computadores ou um perifrico. Com a internet, houve facilidade das informaes, emitidas atravs de diversos pontos, circularem livremente. Com a elaborao deste chat, desenvolvemos entre outras, a capacidade de tratamento de informaes sobre a comunicao em redes, protocolos e, aperfeioamos a prtica e o contedo visto em sala.

Introduo

Na dcada de 1960, a partir de pesquisas militares no perodo da Guerra Fria, surgiu a internet. As superpotncias Estados Unidos e Unio Sovitica, entendiam a eficincia e necessidade dos meios de comunicao de modo que uma ferramenta inovada contribuiria para a disputa. Dessa forma, foi idealizado um prottipo para compartilhar e dividir informaes de modo que permitida a descentralizao da mesma, pois se os Estados Unidos fossem atingidos, informaes sigilosas seriam trazidas a pblico os enfraqueceria. Jovens que questionavam valores centrais vigentes e institudos na cultura ocidental, empenhados na disperso da informao, contriburam para a formao da Internet conhecida atualmente. A internet nos oferece muitos benefcios como nos manter ligados a grandes centros de pesquisas, bibliotecas, a notcias locais e do mundo inteiro. H a possibilidade de morar em um local distante e se manter ligado a todas essas opes e tambm de se comunicar com amigos e familiares em tempo real. Para isso, existem as ferramentas de comunicao em rede. A palavra chat significa conversar com outros usurios conectados na internet. H duas opes para usar o chat: atravs de um programa ou uma pgina de internet. Usando um programa especfico, preciso que este esteja instalado em um computador e tambm, dos demais usurios com quem ser estabelecida uma conversa. Atravs de um Web chat, possvel que o usurio converse com as demais pessoas conectadas na mesma pgina web. Compartilhar recursos permite que usurios de uma rede de computadores troquem informaes e acessem os mesmos ou recursos distintos. Para que seja possvel realizar essa troca, existem linguagens prprias que chamamos de protocolos. Protocolo de Internet um padro que possibilita e controla a comunicao e conexo entre sistemas de computadores. um sistema tcnico que permite o trfego de informaes, ou seja, transferir dados de uma rede a outra. As redes so conectadas por um endereo de IP na internet e estas iro se comunicar para que seja possvel a troca de mensagens.

De modo geral, podemos definir o protocolo como as regras que governam o todo da comunicao. Pode ser implementado por um software, hardware ou atravs da combinao dos dois. O sucesso da internet se deve a expanso e ao grande uso de protocolos de comunicao que requisito fundamental. O trabalho divido em duas partes: a primeira, de cunho terico, onde foi estudado e analisado a histria, os protocolos de rede, e as curiosidades de um comunicador instantneo. Esta etapa, no foi realizada de forma desinteressada e sim, foi uma motivao a buscar e complementar conhecimentos. Na segunda etapa so aplicados conhecimentos prticos vistos em sala e pesquisas, realizando o desenvolvimento do chat.

Fundamentos da comunicao de dados em rede

A indstria da informtica tem evoludo rapidamente. Hoje atravs de um clique o mundo se comunica e se informa com acesso visual independentemente da distncia. No incio, nas primeiras dcadas dos sistemas operacionais, no havia comunicao entre os computadores, mas com o avano das tecnologias surgiu-se a rede de computadores que permite a comunicao entre mquinas. Uma rede de computador composta por dois ou mais computadores interligados, a ligao pode ocorrer de diversas formas como: fio, infravermelho, satlite... Existem diversos tipos de redes de computadores, as diferenas entre cada uma delas avaliada pela rea geogrfica que cobrem (redes longa distncia e rede locais), topologia (rede ponto a ponto e rede de difuso) e modo como os dados so transmitidos. As diferenas entre os tipos de redes possibilitam a escolha de uma rede especfica para cada situao, a cada escolha podemos avaliar itens como: conectividade (capacidade de transferir dados), modularidade (capacidade variar frequncia ou amplitude de ondas eletromagnticas), expansibilidade, segurana e custo.

Tipos de Redes: LAN (Local Area Networks): Conjunto de computadores interligados em uma pequena rea geogrfica. A velocidade de transferncia dos dados pode variar entre 10 Mbps e 1 Gbps. Possui baixo custo e taxa de erros pequena.

WAN( Wide Area Networks): Possibilita interligar computadores que estejam em cidades diferentes. A velocidade de transferncia dos dados menor que a de uma rede LAN. A infraestrutura de uma rede WAN cara.

MAN (Metropolitan Area Networks): Capacidade de interligar computadores em todo o mundo( ex. internet). A velocidade de transferncia dos dados maior do que uma rede WAN e com custo semelhante ao de uma rede LAN.

Modelo OSI Com o objetivo de padronizar a construo de redes de computadores, em 1977 foi criado o modelo OSI (Open Systems Interconnection). Esse modelo consiste na diviso dos aspectos gerais da rede em sete camadas funcionais. Camada Fsica: Meios de conexo por onde iro trafegar os dados. Camada de Enlace: Tem por funo identificar os equipamentos conectados a ela. Camada de Rede: Responsvel pelo endereamento dos pacotes de rede, movimenta os pacotes da fonte original at o destino. Camada de Transporte: Responsvel pela entrega/recebimento dos dados. Camada de Sesso: Gerencia e termina a comunicao entre hosts. Camada de Apresentao: Converte o formato dos dados, possibilitando a comunicao entre duas redes diferentes. Camada de Aplicao: Fornece ao usurio uma Interface para insero/recepo de dados.

Topologias As topologias de redes podem ser classificadas em: Topologias Fsicas: Modo como os cabos so colocados, por onde passam e onde as estaes de localizam. Ponto-a-ponto: Um computador ligado explicitamente a outro. A vantagem a facilidade de monitoramento e instalao e, a desvantagem, devida o alto custo e muito cabeamento. Barramento (BUS): Um computador ligado a outro atravs de vrios segmentos de cabos coaxiais e conectores T. Os dados so transmitidos para todas as mquinas conectadas, entretanto somente o destinatrio correto os conseguir visualizar. O pouco uso de cabos e a estrutura simples uma vantagem porm a dificuldade na isolao de problemas e lentido por seu uso demasiado a desvantagem. Anel (ring): Os computadores so ligados por um cabo e os dados circulam de modo unidirecional (regra) Tem por vantagem o desempenho uniforme e instalao simples e, a dificuldade na isolao de problemas como exemplo, se um n parar todos tambm param, caracteriza a desvantagem.

Estrela: Os computadores so ligados a um hub atravs de cabos de par tranado. Facilidade na localizao de problemas a sua vantagem e, o fato que uma falha no hub paralisa a rede toda uma desvantagem desta topologia. rvore: Tambm conhecida como topologia Hierrquica. caracterizada por uma srie de barras interconectadas com uma barra central.

Esta topologia muito usada para supervisionar aplicaes de tempo real, como algumas de automao industrial e automao bancria. Malha: Os Computadores so ligados uns aos outros com conexes redundantes, fornecendo assim vrios caminhos para que os dados cheguem ao destino final.Tem por vantagem a confiabilidade e facilidade na localizao de problemas e por desvantagem o seu alto custo. Estrutura Mista ou Hbrida: Combina duas ou mais topologias. Proporciona a possibilidade de ligar vrias redes, sendo assim, uma vantagem e, o fato que a ligao no uniforme, caracteriza sua desvantagem.

Topologias Lgicas: Refere-se ao percurso da informao entre os usurios. Ethernet (norma IEEE 802 .3): Em uma rede Ethernet todos os computadores so ligados a uma mesma linha de transmisso. A comunicao feita por um protocolo de acesso mltiplo, o CSMA/CD. Deste modo qualquer computador da rede pode emitir dados em qualquer. Como a comunicao feita: Os computadores verificam se h disponibilidade na linha antes de emitirem os dados. Se houveram emisses simultneas ocorrer coliso de dados. A comunicao dos computadores interrompida e estes aguardam um prazo aleatrio, para que o primeiro que ultrapassar o prazo possa emitir novamente . Token Ring: Mtodo de acesso controlado baseia-se no compartilhamento de tempo. Apenas uma estao que contenha o token poder transmitir por um determinado tempo, aps esse tempo ou caso a mesma no contenha nada a ser emitido o token ser passado para a prxima estao.

Ritmos de transmisso As transmisses de dados podem ocorrer em ritmos sncronos ou assncronos. Em uma transmisso sncrona os relgios tanto do emissor quanto do
8

receptor esto sincronizados existindo dependncia entre eles Na transmisso assncrona os relgios do emissor e receptor no precisam estar sincronizados, apenas suficientemente prximos, sendo eles independentes.

Transmisso de Dados Via satlite: Ocorre atravs da transmisso de ondas geradas por satlites artificiais propagadas pelo ar. A vantagem desse tipo de transmisso a abrangncia de reas onde no possvel estabelecer uma infraestrutura de cabos (ex. navios, avies), j a desvantagem desse meio deve-se ao elevado custo. Via Rdio: As transmisses via radio tm por canal de dados o ar. As transmisses desse tipo podem se sobrepor e sofrer interferncias devido a fenmenos naturais (ex. relmpago) ou mesmo superfcies que causem reflexo. Cabo Par Tranado: composto por quatro cabos, sendo cada um deles entrelaados por dois ou mais fios entrelaados. O objeto dos cabos estarem entrelaados reduzir rudos e manter constantes as propriedades eltricas do meio. Tem por vantagem custo baixo alta flexibilidade e por desvantagem a

suscetibilidade interferncias e limitao fsica. Cabo Coaxial (coax): cabo eltrico com condutor interno cercado por camada isolante. Possui alta capacidade de transmisso, sua eficincia maior que o Par Tranado Possui baixa flexibilidade, alto custo e limitao fsica. Cabo Fibra ptica: Cabo feito de plstico e fibra de vidro ultrapuro, essa tecnologia est substituindo os fios de cobre. A transmisso dos dados ocorre por refrao da luz. A Fibra ptica no sofre interferncia eletromagntica. Tem por vantagem perda de dados desprezvel e desvantagens a limitao fsica e alto custo.

Plano De Desenvolvimento Da Aplicao

Uma grande tendncia na rea industrial tem sido a aplicao de tecnologias de redes de comunicao, como uma aplicao web baseada em chat. Mostraremos adiante quais foram os elementos utilizados no desenvolvimento da aplicao. Foi desenvolvido uma ferramenta de comunicao em rede voltada para chats. No chat, a conversa em tempo real, na qual os participantes digitam suas perguntas, respostas ou afirmaes, sendo que todos que participam desta conversa veem na tela do computador, tudo que foi digitado. Em geral, o chat usado para simples comunicao entre duas ou mais pessoas. No desenvolvimento desta aplicao, foram criadas as seguintes Classes tcpClient e tcpServidor.

tcpClient Primeiramente, declaramos as variveis do tipo: TcpClient, IPAddress, IPEndpoint e Int, utilizadas para montar a conexo com o servidor. Em seguida criamos uma estrutura chamada Pacote (tambm ser utilizada na classe tcpServidor), contendo as strings de nome do usurio e mensagem, que ser trafegada at o outro ponto da conexo (servidor). Observamos que, o tamanho da estrutura pode variar, causando distoro dos dados ao chegar ao seu destino. Para isso, na estrutura Pacote, definimos um padro de tamanho para cada campo dentro da estrutura. O primeiro passo configurar a classe TCPClient para que seja criada uma conexo com a classe TCPServidor. Para isso, construmos os mtodos OuvirServidor e GravarServidor para dar uma condio de trfego com o servidor. OuvirServidor: Utilizada como uma nova thread para aguardar e receber pacotes do servidor atravs de um loop. GravarServidor: Envia a estrutura pacote para o servidor, independente do que nela atualmente esteja gravada.

10

Agora iremos trabalhar com os mtodos de utilizao do frmMessaging, que ir receber o contedo da estrutura pacote. Primeiramente, criamos as funes receberPacoteMensagem e receberPacoteNomeUsuario, que far o papel de receber a mensagem vinda de um determinado usurio (Nota: Se o usurio for Servidor, o form do Chat dever tratar as mensagens de uma forma diferente). Depois criamos o mtodo enviarDados, utilizada para definir a estrutura Pacote com os campos preenchidos (NomeUsuario e Mensagem) e chamar o mtodo GravarServidor. Falaremos sobre os mtodos structToBytes e bytesToStruct, que so utilizados trafegar os dados na rede tanto na class tcpClient quanto na tcpServidor, no prximo tpico.

tcpServidor Comeamos declarando as variveis endereoIP, porta, limiteConexao, numConectados, listaClients, clientStream e tcpClient[], para trabalhar, configurar e executar todas as funcionalidades dentro do Servidor. No mtodo construtor, alimentamos as variveis declaradas, assim como limiteConexao, enderecoIP, porta, enviadas pelo formulrio principal (frmMain). Adiante, utilizamos uma funo atravs de uma thread denominada listenForClients, para que o servidor aceite novas conexes, de acordo com a condio de limite de conexo dada a ela. Para cada conexo aceita, criada uma nova thread aplicada ao mtodo TheadClient, assim o servidor consegue, em tempo real, aguardar novas conexes, receber e enviar mensagens para todos os clientes conectados. A respeito da ThreadClient, fica aguardando mensagens do usurio atravs de um loop, em conjunto com tratamento de excees, que tambm serve para identificar se o cliente est desconectado ou se o mesmo tem condies de manter a conexo ativa. Aps o recebimento da mensagem, atravs da estrutura Pacote, identificamos primeiramente se aquela mensagem trata-se de um comando ou uma mensagem comum. Caso for um comando, tratamos o mesmo atravs do mtodo inteligenciaServidor, se no, utilizamos o mtodo sendToArrayClient para enviar a mensagem comum a todos os usurios conectados ao chat. A funo trata tambm a identificao do cliente conectado, o apelido se est correto ou no.

11

Conforme citado anteriormente, para mensagens que so identificadas como comando, criamos o mtodo inteligenciaServidor, que trata de executar uma determinada ao realizada, como por exemplo: mandar uma mensagem privada, alterar o nick/apelido ou at mesmo desconectar do servidor. Em conjunto com o mtodo InteligenciaServidor, criamos as classes de mandarMensagemParticular, desconectaUsuario. Para mensagens comuns, criamos o mtodo sendToArrayClient, que tem a funo de enviar as mensagens para todos os usurios conectados no servidor. O mais importante, criamos os mtodos structToBytes, que converte estrutura para um array de bytes, e bytesToStruct, que converte array de bytes para uma estrutura. Esses mtodos so essenciais, pois ao enviar uma mensagem, transformamos a estrutura Pacote em um array de bytes, da mesma forma que quando recebemos em bytes, realizamos o processo inverso, que converter em estrutura. Lembrando que devemos definir um padro de tamanho para a estrutura, para que os dados no cheguem distorcidos. Para finalizar, criada a funo para retornar o status do Servidor e para fechar o Servidor. E, utilizamos tambm, as classes/formulrios frmMain e frmMessaging, que fazem o uso das classes tcpClient e tcpServidor. Abaixo est a tela criada, de conexo com o Servidor (frmMain):

12

Observe que para a conexo no servidor, foram estabelecidas vrias condies de tratamentos, como: Aceita apelidos acima de dois caracteres e sem espao; Campo IP e Porta, para verificar se o endereo vlido; Faz com que o servidor aceite conexes at o limite, especificado no campo Limite de conexes;

13

Abaixo, se encontra a tela do chat, que foi desenvolvida:

Para que o log e a lista de participantes permaneam atualizados, precisamos de um Thread - mtodo threadLog. Foram criadas, algumas funes extras: Log: destaque de mensagem de acordo com o remetente. Se a mensagem vier do servidor (nomeUsuario = Servidor), tratamos a mensagem com a cor laranja e negrito, se vier de um usurio qualquer, seu apelido ser negrito e sua mensagem ser com fonte comum. FlashWindow: A tela pisca quando chega uma mensagem de um usurio comum, considerando se a janela frmMessaging no est ativa.

Todo o processo de desenvolvimento de software envolve gerenciamento, planejamento e anlise profunda, visando construo de um produto final que atenda a todas as necessidades levantadas para a resoluo de um dado problema. Elaborado de maneira confivel, rpida e de baixo custo. No obstante, o
14

desenvolvimento de softwares voltados para o ambiente Web tambm requer muitos cuidados, assim como qualquer outro projeto. Todavia, o prprio ambiente ao qual o software ir interagir requer que sejam abordados pontos no triviais a outros tipos de aplicao.

15

Projeto

16

Relatrio Cdigo Fonte

Classe Cliente using System; using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; public class TCPClient { private TcpClient tcpClient; private Thread ThreadOuvir; private IPAddress ip; private IPEndPoint server; private int port; Pacote output; Pacote input; [StructLayout(LayoutKind.Sequential)] [Serializable] private struct Pacote { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string nomeUsuario; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 501)] public string mensagem; } public TCPClient(IPAddress ip, int porta) { this.ip = ip; this.port = porta; tcpClient = new TcpClient(); try { server = new IPEndPoint(this.ip, this.port); tcpClient.Connect(server); ThreadOuvir = new Thread(ouvirServidor); ThreadOuvir.Start(); } catch (ArgumentNullException ex) { throw ex; } catch (ArgumentOutOfRangeException ex) { throw ex; } catch (SocketException ex) { throw ex; } catch (ObjectDisposedException ex) { throw ex; } }
17

#region Mtodos de entrada e sada de dados private void ouvirServidor() { if (tcpClient.Connected == false) { Thread.Sleep(10000); } while (tcpClient.Connected) { try { NetworkStream clientStream = tcpClient.GetStream(); byte[] buffer = new byte[Marshal.SizeOf(typeof(Pacote))]; int bytesRead = clientStream.Read(buffer, 0, buffer.Length); if (bytesRead > 0) { while (output.mensagem != null) { Thread.Sleep(250); } output = bytesToStruct(buffer); } else break; } catch { } } tcpClient.Close(); } private void gravarServidor() { NetworkStream clientStream = tcpClient.GetStream(); byte[] buffer = structToBytes(input); clientStream.Write(buffer, 0, buffer.Length); clientStream.Flush(); } #endregion #region Mtodos de converso de dados struct/bytes[] byte[] structToBytes(Pacote pacote) { int tamanho = Marshal.SizeOf(pacote); byte[] buffer = new byte[tamanho]; IntPtr ponteiro = Marshal.AllocHGlobal(tamanho); Marshal.StructureToPtr(pacote, ponteiro, true); Marshal.Copy(ponteiro, buffer, 0, tamanho); Marshal.FreeHGlobal(ponteiro); return buffer; } Pacote bytesToStruct(byte[] buffer) { Pacote pacote = new Pacote();
18

int tamanho = Marshal.SizeOf(pacote); IntPtr ponteiro = Marshal.AllocHGlobal(tamanho); Marshal.Copy(buffer, 0, ponteiro, tamanho); pacote = (Pacote)Marshal.PtrToStructure(ponteiro, pacote.GetType()); Marshal.FreeHGlobal(ponteiro); return pacote; } #endregion #region Mtodos pblicos public string receberPacoteMensagem() { string temp = output.mensagem; this.output.mensagem = null; return temp; } public string receberPacoteNomeUsuario() { string temp = this.output.nomeUsuario; this.output.nomeUsuario = null; return temp; } public void enviarDados(string nomeUsuario, string mensagem) { this.input.nomeUsuario = nomeUsuario; this.input.mensagem = mensagem; gravarServidor(); } public int getStatusConexao() { if (this.tcpClient.Connected) { return 1; } else { return 0; } } public void fecharConexao() { enviarDados(input.nomeUsuario, "!quit"); this.tcpClient.Close(); } #endregion }

Classe Servidor using System;


19

using System.Text; using System.Threading; using System.Net; using System.Net.Sockets; using System.IO; using System.Runtime.InteropServices;

public class TCPServidor { private IPAddress enderecoIP; private int porta; private int limiteConexao; private int numConectados; private bool[] conectados; private string[] listaClients; private TcpListener tcpServidor; private NetworkStream clientStream; private Thread threadListenForClients; private Thread threadAtualizaListaClients; private int statusServidor; private TcpClient[] tcpClient; [StructLayout(LayoutKind.Sequential)] [Serializable] private struct Pacote { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)] public string nomeUsuario; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 501)] public string mensagem; } public TCPServidor(IPAddress enderecoIP, int porta, int limiteConexao) { try { this.enderecoIP = enderecoIP; this.porta = porta; this.limiteConexao = limiteConexao; this.numConectados = 0; this.conectados = new bool[limiteConexao]; this.listaClients = new string[limiteConexao]; this.tcpClient = new TcpClient[limiteConexao]; this.tcpServidor = new TcpListener(enderecoIP, porta); this.tcpServidor.Start(); this.statusServidor = 1; this.threadListenForClients = new Thread(listenForClients); this.threadAtualizaListaClients = new Thread(atualizaListaClients); this.threadListenForClients.IsBackground = true;
20

this.threadListenForClients.Start(); this.threadAtualizaListaClients.Start(); } catch (Exception ex) { throw ex; } } #region Threads private void listenForClients() { int i = 0; while (true) { try { if (i < limiteConexao) { if (numConectados < limiteConexao) { tcpServidor.Start(); if (conectados[i] == false) { statusServidor = 1; tcpClient[i] = this.tcpServidor.AcceptTcpClient(); clientStream = tcpClient[i].GetStream(); try { Thread clientThread = new ParameterizedThreadStart(threadClient)); clientThread.Start(i); conectados[i] = true; numConectados++; i++; } catch { i--; } } else i++; } else { tcpServidor.Stop(); statusServidor = 2; Thread.Sleep(250); } }
21

Thread(new

else i = 0; } catch (Exception ex) { throw ex; } } } private void threadClient(object obj) { int id = (int)obj; NetworkStream clientStream = this.tcpClient[id].GetStream(); Pacote pacote = new Pacote(); byte[] buffer = structToBytes(pacote); int bytesRead = 0; bytesRead = clientStream.Read(buffer, 0, buffer.Length); pacote = bytesToStruct(buffer); for (int i = 0; i < limiteConexao; i++) { if (pacote.nomeUsuario == listaClients[i] || pacote.nomeUsuario == null || pacote.nomeUsuario == "Servidor") { listaClients[id] = "Desconhecido" + id; pacote.nomeUsuario = "Servidor"; pacote.mensagem = "Apelido invlido, tente novamente digitando !nick"; buffer = structToBytes(pacote); clientStream.Write(buffer, 0, buffer.Length); clientStream.Flush(); break; } } if (listaClients[id] != "Desconhecido" + id) { listaClients[id] = pacote.nomeUsuario; } mandarMensagemParticular(id, "Conexo realizada com "Servidor"); pacote.nomeUsuario = "Servidor"; pacote.mensagem = listaClients[id] + " entrou na sala!"; sendToArrayClient(pacote); while (true) { try { bytesRead = clientStream.Read(buffer, 0, buffer.Length); pacote = bytesToStruct(buffer); pacote.nomeUsuario = listaClients[id]; sucesso! :)",

22

} catch { break; } if (bytesRead == 0) { break; } else { if (pacote.mensagem.Substring(0, 1) == "@") { inteligenciaServidor('@', pacote, id); } else if (pacote.mensagem.Substring(0, 1) == "!") { inteligenciaServidor('!', pacote, id); } else { sendToArrayClient(pacote); } } } desconectaUsuario(id); } private void atualizaListaClients() { try { Pacote pacote = new Pacote(); while (statusServidor > 0) { pacote.nomeUsuario = "ListaServidor"; pacote.mensagem = null; for (int j = 0; j < limiteConexao; j++) { if (listaClients[j] == null) { } else pacote.mensagem += listaClients[j] + ";"; } for (int i = 0; i < limiteConexao; i++) { if (conectados[i]) { clientStream = tcpClient[i].GetStream(); { byte[] buffer = structToBytes(pacote);
23

clientStream.Write(buffer, 0, buffer.Length); clientStream.Flush(); } } } Thread.Sleep(1000); } } catch (Exception ex) { throw ex; }; } #endregion #region Mtodos de uso particular private void inteligenciaServidor(char tipoComando, Pacote pacote, int id) { if (tipoComando == '@') { string[] temp = pacote.mensagem.Replace("@", null).Split(' '); if (temp.Length > 1) { string destino = temp[0]; pacote.mensagem = pacote.mensagem.Substring((2 + destino.Length), pacote.mensagem.Length - (2 + destino.Length)); pacote.nomeUsuario += " -> " + destino; bool mensagemEnviada = false; for (int i = 0; i < limiteConexao; i++) { if (listaClients[i] != null) { if (destino.ToUpper() == listaClients[i].ToUpper()) { mandarMensagemParticular(id,pacote.mensagem, pacote.nomeUsuario); mandarMensagemParticular(i,pacote.mensagem, pacote.nomeUsuario); mensagemEnviada = true; } } } if (mensagemEnviada == false) { mandarMensagemParticular(id, destino + " no foi encontrado.", "Servidor"); } } else { mandarMensagemParticular(id, "Digite o nome do usuario e a mensagem em sequncia (Exemplo: @usuario mensagem).", "Servidor"); }
24

} else if (tipoComando == '!') { string[] temp = pacote.mensagem.Replace("!", null).Split(' '); switch (temp[0]) { case "nick": if (temp.Length > 1) { if (temp[1].Length > 2 && temp[1].Contains(" ") == false && temp[1].Contains(";") == false && temp[1] != "Servidor") { bool nickExistente = false; for (int i = 0; i < limiteConexao; i++) { if (listaClients[i] == temp[1]) { mandarMensagemParticular(id, "Apelido j utilizado por um usurio.", "Servidor"); nickExistente = true; } } if (nickExistente == false) { listaClients[id] = temp[1]; mandarMensagemParticular(id, "Apelido alterado com sucesso!", "Servidor"); Pacote pc = new Pacote(); pc.nomeUsuario = "Servidor"; pc.mensagem = pacote.nomeUsuario + " trocou o apelido para " + temp[1]; sendToArrayClient(pc); } } else { mandarMensagemParticular(id, "Apelido invlido!", "Servidor"); } } else { mandarMensagemParticular(id, "Digite o comando e em seguida o apelido desejado. (Exemplo: !nick Fulano)", "Servidor"); } break; case "quit": desconectaUsuario(id); break; default: mandarMensagemParticular(id, "Comando invlido!", "Servidor");
25

break; } } } private void sendToArrayClient(Pacote pacote) { for (int i = 0; i < limiteConexao; i++) { if (conectados[i]) { clientStream = tcpClient[i].GetStream(); { try { byte[] buffer = structToBytes(pacote); clientStream.Write(buffer, 0, buffer.Length); clientStream.Flush(); } catch (Exception ex) { throw ex; } } } } } private void mandarMensagemParticular(int idDestinatario, string mensagem, string remetente) { Pacote pacote = new Pacote(); clientStream = tcpClient[idDestinatario].GetStream(); pacote.nomeUsuario = remetente; pacote.mensagem = mensagem; byte[] buffer = structToBytes(pacote); clientStream.Write(buffer, 0, buffer.Length); clientStream.Flush(); } private void desconectaUsuario(int id) { if (this.conectados[id] == true) { Pacote pacote; this.numConectados--; this.conectados[id] = false; this.tcpClient[id].Close(); pacote.mensagem = listaClients[id] + " saiu da sala!"; pacote.nomeUsuario = "Servidor"; this.listaClients[id] = null; sendToArrayClient(pacote); }
26

} private byte[] structToBytes(Pacote pacote) { int tamanho = Marshal.SizeOf(pacote); byte[] buffer = new byte[tamanho]; IntPtr ponteiro = Marshal.AllocHGlobal(tamanho); Marshal.StructureToPtr(pacote, ponteiro, true); Marshal.Copy(ponteiro, buffer, 0, tamanho); Marshal.FreeHGlobal(ponteiro); return buffer; } private Pacote bytesToStruct(byte[] buffer) { Pacote pacote = new Pacote(); int tamanho = Marshal.SizeOf(pacote); IntPtr ponteiro = Marshal.AllocHGlobal(tamanho); Marshal.Copy(buffer, 0, ponteiro, tamanho); pacote = (Pacote)Marshal.PtrToStructure(ponteiro, pacote.GetType()); Marshal.FreeHGlobal(ponteiro); return pacote; } #endregion #region Mtodos pblicos public int getStatusServidor() { //0 - DESCONECTADO //1 - CONECTADO //2 - OCUPADO return statusServidor; } public void fecharServidor() { try { tcpServidor.Stop(); statusServidor = 0; for (int i = 0; i < limiteConexao; i++) { if (conectados[i]) { tcpClient[i].Close(); conectados[i] = false; numConectados--; } } threadListenForClients.Abort(); } catch (Exception ex) { throw ex; } }
27

#endregion } Classe Main Form using System; using System.Threading; using System.Net; using System.Net.Sockets; using System.Windows.Forms; using System.Configuration; namespace Chat { public partial class frmMain : Form { TCPServidor servidor; TCPClient cliente; delegate void LogHandler(string mensagem); frmMessaging frmMEssaging = new frmMessaging(); public frmMain() { InitializeComponent(); } private void conectar() { try { cliente = new TCPClient(IPAddress.Parse(txtIP.Text), Convert.ToInt32(txtPorta.Text)); frmMEssaging = new frmMessaging(cliente, txtNick.Text); this.Hide(); frmMEssaging.Show(); } catch (SocketException ex) { MessageBox.Show(ex.Message, "Messaging - Erro"); } catch (ArgumentNullException ex) { MessageBox.Show(ex.Message, "Messaging - Erro"); } catch (ArgumentOutOfRangeException ex) { MessageBox.Show(ex.Message, "Messaging - Erro"); } catch (FormatException) { MessageBox.Show("Dados com formato invlido.\n\n Exemplos:\nIP: 192.168.0.1\nPorta: 5999", "Messaging - Erro"); } catch (Exception) { MessageBox.Show("No foi possvel conectar ao endereo informado, verifique o IP e tente novamente.", "Messaging - Erro"); } }

28

#region Eventos private void btCriarConexao_Click(object sender, EventArgs e) { try { servidor = new TCPServidor(IPAddress.Any, Convert.ToInt32(txtPortaServidor.Text), Convert.ToInt32(txtLimiteConn.Text)); while (servidor.getStatusServidor() == 0) { } if (servidor.getStatusServidor() == 1) { try { cliente = new TCPClient(IPAddress.Parse("127.0.0.1"), Convert.ToInt32(txtPortaServidor.Text.Trim())); frmMEssaging = new frmMessaging(cliente, txtNick.Text.Trim()); this.Hide(); frmMEssaging.Show(); } catch (ArgumentOutOfRangeException ex) { MessageBox.Show(ex.Message, "Messaging - Erro"); servidor.fecharServidor(); } catch (SocketException ex) { MessageBox.Show(ex.Message, "Messaging - Erro"); servidor.fecharServidor(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Messaging - Erro"); servidor.fecharServidor(); } } } catch (Exception ex) { MessageBox.Show(ex.Message, "Messaging - Erro"); } } private void btConectar_Click(object sender, EventArgs e) { conectar(); } private void txtNick_TextChanged(object sender, EventArgs e) { if (txtNick.TextLength > 2 && txtNick.Text.Contains(" ") == false && txtNick.Text.Contains(";") == false) { btCriarConexao.Enabled = true; btConectar.Enabled = true; } else { btCriarConexao.Enabled = false; btConectar.Enabled = false; }
29

} private void frmMain_FormClosed(object sender, FormClosedEventArgs e) { try { servidor.fecharServidor(); } catch {} Application.Exit(); } #endregion private void frmMain_Load(object sender, EventArgs e) { } } }

30

Referncia Bibliogrfica

http://www.hardware.com.br/termos/topologia-de-barramento http://www.editoraferreira.com.br/publique/media/rodney_toq8.pdf http://pt.kioskea.net/contents/initiation/topologi.php3 http://www.cceseb.ipbeja.pt/lablan/ia_topologias.htm http://www.oficinadanet.com.br/artigo/2254/topologia_de_redes_vantagens_e_desva ntagens http://griffinheart.no.sapo.pt/pagina%20REDES_ficheiros/page0005.htm http://www.icefusion.com.br/topologia-de-redes/ http://www.oficinadanet.com.br/artigo/redes/topologias-de-rede http://www.kerax.com.br/blog/96-o-que-e-um-cabo-coaxial http://www.hardware.com.br/livros/hardware-manual/cabo-par-trancado.html http://www.hardware.com.br/livros/hardware-manual/cabo-coaxial.html http://www.hardware.com.br/livros/hardware-manual/fibra-optica.html http://www.infoescola.com/tecnologia/comunicacao-via-satelite/ http://www.gta.ufrj.br/grad/anteriores98/netware-guilherme/netware3.html http://www.oinformante.com/informacoes/01%20-%20TRANSMISSOES%20RF%20%20uma%20introducao%20ao%20assunto.htm http://www.sergio.pro.br/trabalhos/26_funcao_das_camadas_do_modelo_osi.pdf http://www.projetoderedes.com.br/artigos/artigo_modelo_osi.php http://imasters.com.br/artigo/882/redes-e-servidores/o-modelo-osi-e-suas-7-camadas http://pt.kioskea.net/contents/initiation/lan.php3 http://redescomputadores.no.sapo.pt/lanmanwan.htm http://www-usr.inf.ufsm.br/~candia/aulas/espec/Aula_2_LAN_MAN_WAN.pdf http://segurancainformacao.wordpress.com/2009/01/01/redes-de-computadorescamada-de-enlace/

31

http://www2.fis.ua.pt/fisica2006_CD/pdf/FAP28%20%20SISTEMAS%20DE%20COMUNICA%C3%87%C3%83O%20S%C3%8DNCRON A%20E%20ASS%C3%8DNCRONA%20DE.pdf

Apostila UNIP interativa. http://pt.kioskea.net/contents/technologies/ethernet.php3 http://www.knoow.net/ciencinformtelec/informatica/tokenring.htm http://www.tecmundo.com.br/web/1976-o-que-e-fibra-otica-.htm http://pt.scribd.com/doc/31617144/Cabo-Coaxial-e-Par-Trancado http://pt.wikibooks.org/wiki/Introdu%C3%A7%C3%A3o_%C3%A0_comunica%C3%A 7%C3%A3o_entre_computadores_e_tecnologias_de_rede/Comunica%C3%A7%C3 %A3o_via_sat%C3%A9lite

32

FICHAS DE ATIVIDADES PRTICAS SUPERVISIONADAS


Atividades Prticas Supervisionadas (laboratrios, atividades em biblioteca, iniciao cientfica, trabalhos individuais ou em grupo, prticas de ensino e outras)

NOME: Bruna de Jesus Ramos RA: A5430H-1 CAMPUS: Swift CURSO: Cincia da Computao SEMESTRE: 5 Semestre TURNO: Noturno
ASSINATURA DATA ATIVIDADE TOTAL DE HORAS ALUNO PROFESSOR

Questionamento para escolha da ferramenta em 4/mai rede 4/mai Levantamento dos principais pontos a desenvolver Levantamento de contedo para Objetivo e 11/mai Introduo 11/mai Incio do desenvolvimento do cdigo 18/mai Desenvolvimento dos tpicos Objetivo e Introduo 18/mai Continuao do desenvolvimento do cdigo 19/mai Incio do desenvolvimento do tpico Fundamentos 19/mai Continuao do desenvolvimento do cdigo 21/mai Fim do desenvolvimento do tpico Fundamentos 25/mai Fim do desenvolvimento do cdigo 25/mai Alteraes e reviso de todo o cdigo 26/mai Montagem de todo o trabalho 28/mai Reviso de todos os tpicos do trabalho

5 horas 8 horas 3 horas 4 horas 4 horas 3 horas 3 horas 4 horas 4 horas 5 horas 4 horas 8 horas 6 horas

Bruna Bruna Bruna Bruna Bruna Bruna Bruna Bruna Bruna Bruna Bruna Bruna Bruna

Total de Horas: 61 horas

33

FICHAS DE ATIVIDADES PRTICAS SUPERVISIONADAS


Atividades Prticas Supervisionadas (laboratrios, atividades em biblioteca, iniciao cientfica, trabalhos individuais ou em grupo, prticas de ensino e outras)

NOME: Cnthia Valeriano Barbosa RA: A3378B-1 CAMPUS: Swift CURSO: Cincia da Computao SEMESTRE: 4 Semestre TURNO: Noturno
ASSINATURA DATA ATIVIDADE TOTAL DE HORAS ALUNO PROFESSOR

Questionamento para escolha da ferramenta em 4/mai rede 4/mai Levantamento dos principais pontos a desenvolver Levantamento de contedo para Objetivo e 11/mai Introduo 11/mai Incio do desenvolvimento do cdigo 18/mai Desenvolvimento dos tpicos Objetivo e Introduo 18/mai Continuao do desenvolvimento do cdigo 19/mai Incio do desenvolvimento do tpico Fundamentos 19/mai Continuao do desenvolvimento do cdigo 21/mai Fim do desenvolvimento do tpico Fundamentos 25/mai Fim do desenvolvimento do cdigo 25/mai Alteraes e reviso de todo o cdigo 26/mai Montagem de todo o trabalho 28/mai Reviso de todos os tpicos do trabalho

5 horas 8 horas 3 horas 4 horas 4 horas 3 horas 3 horas 4 horas 4 horas 5 horas 4 horas 8 horas 6 horas

Cinthia Cinthia Cinthia Cinthia Cinthia Cinthia Cinthia Cinthia Cinthia Cinthia Cinthia Cinthia Cinthia

Total de Horas: 61 horas

34

FICHAS DE ATIVIDADES PRTICAS SUPERVISIONADAS


Atividades Prticas Supervisionadas (laboratrios, atividades em biblioteca, iniciao cientfica, trabalhos individuais ou em grupo, prticas de ensino e outras)

NOME: Elvis Quirino RA: A514236 CAMPUS: Swift CURSO: Cincia da Computao SEMESTRE: 5 Semestre TURNO: Noturno
ASSINATURA DATA ATIVIDADE TOTAL DE HORAS ALUNO PROFESSOR

Questionamento para escolha da ferramenta em 4/mai rede 4/mai Levantamento dos principais pontos a desenvolver Levantamento de contedo para Objetivo e 11/mai Introduo 11/mai Incio do desenvolvimento do cdigo 18/mai Desenvolvimento dos tpicos Objetivo e Introduo 18/mai Continuao do desenvolvimento do cdigo 19/mai Incio do desenvolvimento do tpico Fundamentos 19/mai Continuao do desenvolvimento do cdigo 21/mai Fim do desenvolvimento do tpico Fundamentos 25/mai Fim do desenvolvimento do cdigo 25/mai Alteraes e reviso de todo o cdigo 26/mai Desenvolvimento do tpico Plan. Desenvolvimento 26/mai Desenvolvimento UML - Projeto 26/mai Montagem de todo o trabalho 28/mai Reviso de todos os tpicos do trabalho

5 horas 8 horas 3 horas 4 horas 4 horas 3 horas 3 horas 4 horas 4 horas 5 horas 4 horas 3 horas 2 horas 4 horas 6 horas

Elvis Elvis Elvis Elvis Elvis Elvis Elvis Elvis Elvis Elvis Elvis Elvis Elvis Elvis

Total de Horas: 62 horas

35

FICHAS DE ATIVIDADES PRTICAS SUPERVISIONADAS


Atividades Prticas Supervisionadas (laboratrios, atividades em biblioteca, iniciao cientfica, trabalhos individuais ou em grupo, prticas de ensino e outras)

NOME:Victoria Helena Barbanera RA: A474BD-8 CAMPUS: Swift CURSO: Cincia da Computao SEMESTRE: 4 Semestre TURNO: Noturno
ASSINATURA DATA ATIVIDADE TOTAL DE HORAS ALUNO PROFESSOR

Questionamento para escolha da ferramenta em 4/mai rede 4/mai Levantamento dos principais pontos a desenvolver Levantamento de contedo para Objetivo e 11/mai Introduo 11/mai Incio do desenvolvimento do cdigo 18/mai Desenvolvimento dos tpicos Objetivo e Introduo 18/mai Continuao do desenvolvimento do cdigo 19/mai Incio do desenvolvimento do tpico Fundamentos 19/mai Continuao do desenvolvimento do cdigo 21/mai Fim do desenvolvimento do tpico Fundamentos 25/mai Fim do desenvolvimento do cdigo 25/mai Alteraes e reviso de todo o cdigo 26/mai Montagem de todo o trabalho 28/mai Reviso de todos os tpicos do trabalho

5 horas 8 horas 3 horas 4 horas 4 horas 3 horas 3 horas 4 horas 4 horas 5 horas 4 horas 8 horas 6 horas

Victoria Victoria Victoria Victoria Victoria Victoria Victoria Victoria Victoria Victoria Victoria Victoria Victoria

Total de Horas: 61 horas

36

Anda mungkin juga menyukai