Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3.
Transcript of Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3.
Sistemas DistribuídosSistemas DistribuídosJosé Pacheco de Almeida PradoJosé 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”.
11/04/23Sistemas Distribuídos – prof. Pacheco 2
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.
11/04/23Sistemas Distribuídos – prof. Pacheco 3
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.
11/04/23Sistemas Distribuídos – prof. Pacheco 4
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.
11/04/23Sistemas Distribuídos – prof. Pacheco 5
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.
11/04/23Sistemas Distribuídos – prof. Pacheco 6
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.
11/04/23Sistemas Distribuídos – prof. Pacheco 7
Implementando uma aplicação com Socket
Temos que criar uma aplicação
Servidor e outra Cliente.
11/04/23Sistemas Distribuídos – prof. Pacheco 8
Implementando o Servidor
1. Criar um projeto do tipo WindowsForm com o nome ServidorSocket.
2. Incluir um botão que será utilizado para enviar mensagem do servidor para o cliente.
11/04/23Sistemas Distribuídos – prof. Pacheco 9
Implementando o Servidor
11/04/23Sistemas Distribuídos – prof. Pacheco 10
No C# para se trabalhar com sockets
os recursos encontram-se no
namespace System.Net.Sockets.
11/04/23Sistemas Distribuídos – prof. Pacheco 11
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;
11/04/23Sistemas Distribuídos – prof. Pacheco 12
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;
11/04/23Sistemas Distribuídos – prof. Pacheco 13
Implementando uma aplicação com Socket
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.11/04/23Sistemas Distribuídos – prof. Pacheco 14
Thread
public Form1() { InitializeComponent(); thread = new Thread(new ThreadStart(RunServidor)); thread.Start(); }
11/04/23Sistemas Distribuídos – prof. Pacheco 15
Thread
public void RunServidor() {
}
11/04/23Sistemas Distribuídos – prof. Pacheco 16
Executa o Socket
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.
11/04/23Sistemas Distribuídos – prof. Pacheco 17
Iniciando o Socketpublic 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");
11/04/23Sistemas Distribuídos – prof. Pacheco 18
Iniciando o Socketpublic 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");
11/04/23Sistemas Distribuídos – prof. Pacheco 19
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);
11/04/23Sistemas Distribuídos – prof. Pacheco 20
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);
11/04/23Sistemas Distribuídos – prof. Pacheco 21
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);
11/04/23Sistemas Distribuídos – prof. Pacheco 22
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();
11/04/23Sistemas Distribuídos – prof. Pacheco 23
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();
11/04/23Sistemas Distribuídos – prof. Pacheco 24
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();
11/04/23Sistemas Distribuídos – prof. Pacheco 25
Loop de EsperaMessageBox.Show("Conexão Realizada!", "Servidor");
binaryWriter.Write("\nConexão Efetuada!");
string messageReceived = "";
do
{
messageReceived = binaryReader.ReadString();
MessageBox.Show("Mensagem: " + messageReceived, "Servidor");
} while (socket.Connected);
11/04/23Sistemas Distribuídos – prof. Pacheco 26
Loop de EsperaMessageBox.Show("Conexão Realizada!", "Servidor");
binaryWriter.Write("\nConexão Efetuada!");
string messageReceived = "";
do
{
messageReceived = binaryReader.ReadString();
MessageBox.Show("Mensagem: " + messageReceived, "Servidor");
} while (socket.Connected);
11/04/23Sistemas Distribuídos – prof. Pacheco 27
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");
}
11/04/23Sistemas Distribuídos – prof. Pacheco 28
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");
}
11/04/23Sistemas Distribuídos – prof. Pacheco 29
Botão Envia
try { binaryWriter.Write("Olá Mundo!!!!” ); } catch (SocketException socketEx) { MessageBox.Show(socketEx.Message, "Erro"); }
11/04/23Sistemas Distribuídos – prof. Pacheco 30
Botão Envia
try { binaryWriter.Write("Olá Mundo!!!!” ); } catch (SocketException socketEx) { MessageBox.Show(socketEx.Message, "Erro"); }
11/04/23Sistemas Distribuídos – prof. Pacheco 31
Implementando o Cliente
O Cliente tem uma estrutura semelhante
ao do Servidor. Seu funcionamento
também é baseado em uma Thread.
11/04/23Sistemas Distribuídos – prof. Pacheco 32
Thread
public Form1() { InitializeComponent(); thread = new Thread(new ThreadStart(RunCliente)); thread.Start(); }
11/04/23Sistemas Distribuídos – prof. Pacheco 33
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.
11/04/23Sistemas Distribuídos – prof. Pacheco 34
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.
11/04/23Sistemas Distribuídos – prof. Pacheco 35
Implementando o Cliente
private NetworkStream networkStream; private BinaryWriter binaryWriter; private BinaryReader binaryReader; private TcpClient tcpClient;
private Thread thread;
11/04/23Sistemas Distribuídos – prof. Pacheco 36
Implementando o Cliente
public void RunCliente() { try { tcpClient = new TcpClient(); tcpClient.Connect("127.0.0.1", 2001);
11/04/23Sistemas Distribuídos – prof. Pacheco 37
Implementando o Cliente
public void RunCliente() { try { tcpClient = new TcpClient(); tcpClient.Connect("127.0.0.1", 2001);
11/04/23Sistemas Distribuídos – prof. Pacheco 38
Implementando o Cliente { tcpClient = new TcpClient(); tcpClient.Connect("127.0.0.1", 2001);
networkStream = tcpClient.GetStream(); binaryWriter = new BinaryWriter(networkStream); binaryReader = new BinaryReader(networkStream);
11/04/23Sistemas Distribuídos – prof. Pacheco 39
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();
11/04/23Sistemas Distribuídos – prof. Pacheco 40
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");
11/04/23Sistemas Distribuídos – prof. Pacheco 41
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");
11/04/23Sistemas Distribuídos – prof. Pacheco 42
Botão Envia
try { binaryWriter.Write("O cliente está ativo!!!!"); } catch (SocketException socketEx) { MessageBox.Show(socketEx.Message, "Erro"); }
11/04/23Sistemas Distribuídos – prof. Pacheco 43
Erro na Conexão
11/04/23Sistemas Distribuídos – prof. Pacheco 44