sistemas distribuídos josé pacheco de almeida prado socket em c# capítulo 3

44
Sistemas Distribuídos Sistemas Distribuídos José Pacheco de Almeida Prado José Pacheco de Almeida Prado Socket em C# Capítulo 3

Upload: internet

Post on 17-Apr-2015

108 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 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

Page 2: 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”.

11/04/23Sistemas Distribuídos – prof. Pacheco 2

Page 3: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 4: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 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

Page 5: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 6: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 7: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 8: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

Implementando uma aplicação com Socket

Temos que criar uma aplicação

Servidor e outra Cliente.

11/04/23Sistemas Distribuídos – prof. Pacheco 8

Page 9: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 10: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

Implementando o Servidor

11/04/23Sistemas Distribuídos – prof. Pacheco 10

Page 11: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 12: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 13: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 14: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 15: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

Thread

public Form1() { InitializeComponent(); thread = new Thread(new ThreadStart(RunServidor)); thread.Start(); }

11/04/23Sistemas Distribuídos – prof. Pacheco 15

Page 16: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

Thread

public void RunServidor() {

}

11/04/23Sistemas Distribuídos – prof. Pacheco 16

Executa o Socket

Page 17: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 18: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 19: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 20: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 21: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 22: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 23: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 24: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 25: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 26: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 27: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 28: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 29: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 30: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

Botão Envia

try { binaryWriter.Write("Olá Mundo!!!!” ); } catch (SocketException socketEx) { MessageBox.Show(socketEx.Message, "Erro"); }

11/04/23Sistemas Distribuídos – prof. Pacheco 30

Page 31: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

Botão Envia

try { binaryWriter.Write("Olá Mundo!!!!” ); } catch (SocketException socketEx) { MessageBox.Show(socketEx.Message, "Erro"); }

11/04/23Sistemas Distribuídos – prof. Pacheco 31

Page 32: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 33: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

Thread

public Form1() { InitializeComponent(); thread = new Thread(new ThreadStart(RunCliente)); thread.Start(); }

11/04/23Sistemas Distribuídos – prof. Pacheco 33

Page 34: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 35: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 36: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 37: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 38: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 39: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 40: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 41: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 42: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 43: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

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

Page 44: Sistemas Distribuídos José Pacheco de Almeida Prado Socket em C# Capítulo 3

Erro na Conexão

11/04/23Sistemas Distribuídos – prof. Pacheco 44