Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3
Comunicação via socket com C# Socket é o elo de ligação entre os processos do servidor e do cliente. Ele é a “porta” na qual os processos enviam e recebem mensagens. De acordo com JAMES F KUROSE: “socket é a interface entre a camada de aplicação e a de transporte dentro de uma máquina”. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Comunicação via socket com C# Através de um socket podemos estabelecer a comunicação entre máquinas possibilitando o envio e recebimento de dados. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Comunicação via socket com C# A interface padronizada de sockets surgiu originalmente no sistema operacional Unix BSD (Berkeley Software Distribution). Tinha a função de suporte a comunicação em rede. Esta interface é a base para a maioria das interfaces entre protocolos de internet TCP/IP existente. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Comunicação via socket com C# Através de um socket podemos estabelecer a comunicação entre máquinas possibilitando o envio e recebimento de dados. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Comunicação via socket com C# A identificação de um socket na rede é realizada por um IP e um porta. Comumente utiliza-se portas acima de 1000 pois as inferiores são utilizadas pelo sistema operacional. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Comunicação via socket com C# Sua comunicação é realizada pelos protocolos UDP ou TCP. Assim, é possível termos tanto comunicação orientada a conexão (via TCP), quanta não orientada a conexão (via UDP). O socket abstrai esse conceito, permitindo assim a utilização de qualquer um dos meios. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando uma aplicação com Socket Temos que criar uma aplicação Servidor e outra Cliente. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Servidor Criar um projeto do tipo WindowsForm com o nome ServidorSocket. Incluir um botão que será utilizado para enviar mensagem do servidor para o cliente. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Servidor Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando uma aplicação com Socket No C# para se trabalhar com sockets os recursos encontram-se no namespace System.Net.Sockets. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando uma aplicação com Socket using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando uma aplicação com Socket using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Servidor O Servidor quanto o Cliente trabalha com processamento em paralelo (Thread) para evitar que a aplicação fique travada até o término do processamento, ou para manter um processamento dedicado e contínuo que é o caso do servidor. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Thread public Form1() { InitializeComponent(); thread = new Thread(new ThreadStart(RunServidor)); thread.Start(); } Sistemas Distribuídos – prof. Pacheco 25/03/2017
Thread Executa o Socket public void RunServidor() { } Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Servidor No exemplo, para realizar a comunicação o Servidor utiliza o objeto TcpListener que fica escutando toda requisição no IP 127.0.0.1 porta 2001. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Iniciando o Socket public void RunServidor() { TcpListener tcpListener; try IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2001); tcpListener = new TcpListener(ipEndPoint); tcpListener.Start(); MessageBox.Show("Servidor habilitado e escutando porta...", "Servidor"); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Iniciando o Socket public void RunServidor() { TcpListener tcpListener; try IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2001); tcpListener = new TcpListener(ipEndPoint); tcpListener.Start(); MessageBox.Show("Servidor habilitado e escutando porta...", "Servidor"); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Esperando Cliente... tcpListener.Start(); MessageBox.Show("Servidor habilitado e escutando porta...", "Servidor"); socket = tcpListener.AcceptSocket(); networkStream = new NetworkStream(socket); binaryWriter = new BinaryWriter(networkStream); binaryReader = new BinaryReader(networkStream); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Esperando Cliente... tcpListener.Start(); MessageBox.Show("Servidor habilitado e escutando porta...", "Servidor"); socket = tcpListener.AcceptSocket(); networkStream = new NetworkStream(socket); binaryWriter = new BinaryWriter(networkStream); binaryReader = new BinaryReader(networkStream); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Definindo um Fluxo de Dados para a Rede.... tcpListener.Start(); MessageBox.Show("Servidor habilitado e escutando porta...", "Servidor"); socket = tcpListener.AcceptSocket(); networkStream = new NetworkStream(socket); binaryWriter = new BinaryWriter(networkStream); binaryReader = new BinaryReader(networkStream); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Conectando ao Cliente... networkStream = new NetworkStream(socket); binaryWriter = new BinaryWriter(networkStream); binaryReader = new BinaryReader(networkStream); MessageBox.Show("Conexão Realizada!", "Servidor"); binaryWriter.Write("\nConexão Efetuada!"); string messageReceived = ""; do { messageReceived = binaryReader.ReadString(); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Conectando ao Cliente... networkStream = new NetworkStream(socket); binaryWriter = new BinaryWriter(networkStream); binaryReader = new BinaryReader(networkStream); MessageBox.Show("Conexão Realizada!", "Servidor"); binaryWriter.Write("\nConexão Efetuada!"); string messageReceived = ""; do { messageReceived = binaryReader.ReadString(); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Enquanto isto no lado do Cliente... networkStream = new NetworkStream(socket); binaryWriter = new BinaryWriter(networkStream); binaryReader = new BinaryReader(networkStream); MessageBox.Show("Conexão Realizada!", "Servidor"); binaryWriter.Write("\nConexão Efetuada!"); string messageReceived = ""; do { messageReceived = binaryReader.ReadString(); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Loop de Espera MessageBox.Show("Conexão Realizada!", "Servidor"); binaryWriter.Write("\nConexão Efetuada!"); string messageReceived = ""; do { messageReceived = binaryReader.ReadString(); MessageBox.Show("Mensagem: " + messageReceived, "Servidor"); } while (socket.Connected); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Loop de Espera MessageBox.Show("Conexão Realizada!", "Servidor"); binaryWriter.Write("\nConexão Efetuada!"); string messageReceived = ""; do { messageReceived = binaryReader.ReadString(); MessageBox.Show("Mensagem: " + messageReceived, "Servidor"); } while (socket.Connected); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Fim da Conexão } while (socket.Connected); catch (Exception ex) { MessageBox.Show(ex.Message); } finally binaryReader.Close(); binaryWriter.Close(); networkStream.Close(); socket.Close(); MessageBox.Show("Conexão Finalizada", "Servidor"); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Fim da Conexão } while (socket.Connected); catch (Exception ex) { MessageBox.Show(ex.Message); } finally binaryReader.Close(); binaryWriter.Close(); networkStream.Close(); socket.Close(); MessageBox.Show("Conexão Finalizada", "Servidor"); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Botão Envia try { binaryWriter.Write("Olá Mundo!!!!” ); } catch (SocketException socketEx) MessageBox.Show(socketEx.Message, "Erro"); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Botão Envia try { binaryWriter.Write("Olá Mundo!!!!” ); } catch (SocketException socketEx) MessageBox.Show(socketEx.Message, "Erro"); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Cliente O Cliente tem uma estrutura semelhante ao do Servidor. Seu funcionamento também é baseado em uma Thread. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Thread public Form1() { InitializeComponent(); thread = new Thread(new ThreadStart(RunCliente)); thread.Start(); } Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Cliente Na aplicação Cliente o objeto TcpClient é informado sobre o IP (ou DNS) e porta do servidor que irá se conectar. Após esse a realização toda a comunicação é feita por meio de stream através do objeto NetworkStream. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Cliente Na aplicação Cliente o objeto TcpClient é informado sobre o IP (ou DNS) e porta do servidor que irá se conectar. Após esse a realização toda a comunicação é feita por meio de stream através do objeto NetworkStream. Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Cliente private NetworkStream networkStream; private BinaryWriter binaryWriter; private BinaryReader binaryReader; private TcpClient tcpClient; private Thread thread; Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Cliente public void RunCliente() { try tcpClient = new TcpClient(); tcpClient.Connect("127.0.0.1", 2001); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Cliente public void RunCliente() { try tcpClient = new TcpClient(); tcpClient.Connect("127.0.0.1", 2001); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Implementando o Cliente { tcpClient = new TcpClient(); tcpClient.Connect("127.0.0.1", 2001); networkStream = tcpClient.GetStream(); binaryWriter = new BinaryWriter(networkStream); binaryReader = new BinaryReader(networkStream); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Enquanto isto no Servidor.... networkStream = new NetworkStream(socket); binaryWriter = new BinaryWriter(networkStream); binaryReader = new BinaryReader(networkStream); MessageBox.Show("Conexão Realizada!", "Servidor"); binaryWriter.Write("\nConexão Efetuada!"); string messageReceived = ""; do { messageReceived = binaryReader.ReadString(); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Loop de Espera String message = ""; do { try message = binaryReader.ReadString(); MessageBox.Show(message, "Mensagem Recebida"); } catch (Exception ex) MessageBox.Show(ex.Message, "Erro"); message = "FIM"; } while (message != "FIM"); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Loop de Espera String message = ""; do { try message = binaryReader.ReadString(); MessageBox.Show(message, "Mensagem Recebida"); } catch (Exception ex) MessageBox.Show(ex.Message, "Erro"); message = "FIM"; } while (message != "FIM"); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Botão Envia try { binaryWriter.Write("O cliente está ativo!!!!"); } catch (SocketException socketEx) MessageBox.Show(socketEx.Message, "Erro"); Sistemas Distribuídos – prof. Pacheco 25/03/2017
Erro na Conexão Sistemas Distribuídos – prof. Pacheco 25/03/2017