Você está na página 1de 7

02/11/2014

Comunicao via socket com C# | Sylverio

Sylverio
Gerenciamento de Projetos, Anlise,
Arquitetura, Orientao a Objetos,
UML, Tecnologias e Programao

Comunicao via socket com C#


Posted on 12/22/2009 by Carlos Fernando Sylverio

Introduo
Primeiramente vamos conceiturar o que socket, ou soquete em portugues. De uma viso geral um soquete pode
ser definido como uma tomada que designa uma cavidade ou regio usada para ligar algum artifcio especfico.
No mundo da computao, um socket o elo de ligao 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 aplicao e a de transporte dentro de uma mquina. Para quem no lembra, ou no sabe, camada
de aplicao e transporte fazem parte do modelo OSI.
Atravs de um socket podemos estabelecer a comunicao entre mquinas possibilitando o envio e recebimento
de dados.
A interface padronizada de sockets surgiu originalmente no sistema operacional Unix BSD (Berkeley Software
Distribution). Tinha a funo de suporte a comunicao em rede. Esta interface a base para a maioria das
interfaces entre protocolos de internet TCP/IP existente.
A identificao de um socket na rede realizada por um IP e um porta. Comumente utiliza-se portas acima de
1000 pois as inferiores so utilizadas pelo sistema operacional. Sua comunicao realizada pelos protocolos UDP
ou TCP. Assim, possvel termos tanto comunicao orientada a conexo (via TCP), quanta no orientada a
conexo (via UDP). O socket abstrai esse conceito, permitindo assim a utilizao de qualquer um dos meios.
No C# para se trabalhar com sockets os recursos enconstram-se no namespace System.Net.Sockets.
Implementando uma aplicao com socket
Este um simples cdigo de uma aplicao Client/Server utilizando socket.
Abaixo o passo a passo de criao da aplicao:
Server App
1. Criar um projeto do tipo WindowsForm com o nome CommunicationSocket.
2. Incluir um boto que ser utilizado para enviar mensagem do servidor para o cliente.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

using
using
using
using
using
using

System;
System.IO;
System.Net;
System.Net.Sockets;
System.Threading;
System.Windows.Forms;

namespace CommunicationSocket
{
public partial class ServerApp : Form
{
private Socket socket;
private Thread thread;
private NetworkStream networkStream;
private BinaryWriter binaryWriter;
private BinaryReader binaryReader;

http://sylverio.com.br/blog/2009/12/comunicacao-via-socket-com-c/

1/7

02/11/2014
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 }

Comunicao via socket com C# | Sylverio


public ServerApp()
{
InitializeComponent();
thread = new Thread(new ThreadStart(RunServer));
thread.Start();
}
public void RunServer()
{
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...", "Server App");
socket = tcpListener.AcceptSocket();
networkStream = new NetworkStream(socket);
binaryWriter = new BinaryWriter(networkStream);
binaryReader = new BinaryReader(networkStream);
MessageBox.Show("conexo recebida!", "Server App");
binaryWriter.Write("\nconexo efetuada!");
string messageReceived = "";
do
{
messageReceived = binaryReader.ReadString();
MessageBox.Show("Mensagem: " + messageReceived, "Server App");
} while (socket.Connected);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
binaryReader.Close();
binaryWriter.Close();
networkStream.Close();
socket.Close();
MessageBox.Show("conexo finalizada", "Server App");
}
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
try
{
binaryWriter.Write("Server respondendo: Houston, we have a problem!!!");
}
catch (SocketException socketEx)
{
MessageBox.Show(socketEx.Message, "Erro");
}
}
}

Client App
1. Criar um projeto do tipo WindowsForm com o nome ClientApp.
2. Incluir boto que ser utilizado para enviar mensagem do cliente para o servidor.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

using
using
using
using
using

System;
System.IO;
System.Net.Sockets;
System.Threading;
System.Windows.Forms;

namespace ClientApplication
{
public partial class ClientAppForm : Form
{
private NetworkStream networkStream;
private BinaryWriter binaryWriter;
private BinaryReader binaryReader;
private TcpClient tcpClient;

http://sylverio.com.br/blog/2009/12/comunicacao-via-socket-com-c/

2/7

02/11/2014
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 }

Comunicao via socket com C# | Sylverio


private Thread thread;
public ClientAppForm()
{
InitializeComponent();
thread = new Thread(new ThreadStart(RunClient));
thread.Start();
}
public void RunClient()
{
try
{
tcpClient = new TcpClient();
tcpClient.Connect("127.0.0.1", 2001);
networkStream = tcpClient.GetStream();
binaryWriter = new BinaryWriter(networkStream);
binaryReader = new BinaryReader(networkStream);
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");
binaryWriter.Close();
binaryReader.Close();
networkStream.Close();
tcpClient.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Erro");
}
}
private void btnSendMsg_Click(object sender, EventArgs e)
{
try
{
binaryWriter.Write("Mensagem do cliente");
}
catch (SocketException socketEx)
{
MessageBox.Show(socketEx.Message, "Erro");
}
}
}

Para realizar a comunicao o Servidor utiliza o objeto TcpListener que fica escutando toda requisio no IP
127.0.0.1 porta 2001.
Na aplicao Cliente o objeto TcpClient informado sobre o IP (ou DNS) e porta do servidor que ir se conectar.
Aps esse a realizao toda a comunicao feita por meio de stream atravs do objeto NetworkStream.
Repare que tanto Servidor quanto o Cliente trabalha com processamento em paralelo (Thread) para evitar que a
aplicao fique travada at o trmino do processamento, ou para manter um processamento dedicado e contnuo
que o caso do servidor.
Nesse exemplo utilizei MessageBox para apresentar as mensagens, pois para inseri-las em um TextBox no Form
necessrio utilizar delegates e reflections, seno teremos um erro de cruzamento de Threads (Cross-thread
operation not valid).
Mas isso acho que assunto para o nosso prximo post.
At mais
http://sylverio.com.br/blog/2009/12/comunicacao-via-socket-com-c/

3/7

02/11/2014

Comunicao via socket com C# | Sylverio

Compatilhe!
This entry was posted in Programao, Tecnologia and tagged C#, Framework.NET. Bookmark the permalink.

18 Responses to Comunicao via socket com C#


Dorivan says:
07/13/2011 at 8:08 am

tem algum exemplo usando delegate e reflection

Carlos Fernando Sylverio says:


07/14/2011 at 7:53 am

Dorivan no possuo, mas posso fazer sendo um dos prximos post.

Danilo says:
07/27/2011 at 8:37 am

Boa Documentao!!!
Ps:Caso no queiram implementar um delegate ou reflection , podem estar colocando no load do form a linha de comando.
CheckForIllegalCrossThreadCalls = false;
Vai funcionar!!

Ciro Peixoto says:


03/14/2012 at 2:15 pm

Ol Sylverio!
Primeiramento parabens pela iniciativa.
Sou Engenheiro Eletrnico da velha guarda (tenho 51 anos) tenho um bom conhecimento na area de microprocessadores
ATMEL PIC e venho estudando no peito primeiramente VB.Net e agora C#
Tenho encontrado muita dificuldade em compreender como operar com Sockets EM 2 MICROS DIFERENTES
Com os dois programs (client/server) no mesmo computador a coisa rola bem. Mas como fao para colocar isto
funcionando em computadores diferentes um rodando como server outro como client????
Acho que est me faltando teoria
Se voce puder me ajudar ou pelo menos me indicar o que devo ler, ficarei muito agradecido
Obrigado pela ateno
Ciro Peixoto

Franciscatto says:
03/17/2012 at 2:13 pm

Respondendo ao Ciro Peixoto.


http://sylverio.com.br/blog/2009/12/comunicacao-via-socket-com-c/

4/7

02/11/2014

Comunicao via socket com C# | Sylverio

No cliente, na linha tcpClient.Connect(127.0.0.1, 2001);, voc tem que colocar o IP da mquina onde o server est em
execuo. Ex 192.168.1.5.
Franciscatto

Ermano says:
09/07/2012 at 11:50 pm

Simples e direto. Muito bom !

Diego says:
10/06/2012 at 6:46 pm

Boa Note,
Ermano,
Por gentileza, me mostra como fao para receber a mensagem do cliente em uma textBox.
Abraos,
Show Tutorial

Carlos Fernando Sylverio says:


10/08/2012 at 10:49 am

Ol Diego,
No testei, mas acredito que seja s sustituir o MessageBox.Show por um controle TextBox.
O que pode acontecer com isso, ter um erro de Thread, teria que ser disparada utilizando delegate para no ter problema.
Abraos

Anderson Machado says:


06/01/2013 at 11:24 am

Ol, parabns pelo post, foi de grande ajuda.


Bom, estou tentando implementar ele atravs da internet, pela rede local funcionou maravilhosamente, mas gostaria de saber
se possvel conectar ao serv app estando em uma rede diferente e atravs da internet.
Obrigado.
Anderson

Carlos Fernando Sylverio says:


06/02/2013 at 8:15 pm

Ol Anderson.
Obrigado. Respondendo sua dvida.
Nunca fiz esse tipo de implementao pela internet. Utilizei socket em alguns projetos comerciais, porem sempre dentro de
uma rede corporativa.
Acredito que funcione, porem verifique as configuraes de firewall e switch que podem bloquear a comunicao.
Boa sorte e se comente aqui depois se descobrir algo novo.
http://sylverio.com.br/blog/2009/12/comunicacao-via-socket-com-c/

5/7

02/11/2014

Comunicao via socket com C# | Sylverio

Abrao

reginaldo says:
09/09/2013 at 12:48 pm

Este exemplo, permite conectar mais de um cliente ao mesmo tempo?

Carlos Fernando Sylverio says:


09/11/2013 at 11:18 pm

Ol Reginaldo, no. Esse exemplo ele s possui um processo para tratar a requisio.
Para isso voc teria que criar uma Thread para tratar cada requisio de forma separada.

Felipe says:
11/18/2013 at 4:50 pm

Ol Carlos, como modificar esse cdigo para que ele me de uma listagem de arquivos do Servidor para o Cliente para que eu
possa selecionar um arquivo e fazer o download desse arquivo?

Marcos Pereira de Souza says:


11/28/2013 at 9:33 am

Ol Carlos, parabns pela matria. Atravs de sua explicao, criei dois programas que se comunicam entre si . Tenho um
equipamento de leitura de chip que se comunica atravs de IP, o primeiro programa que criei, se conecta a este equipamento
e envia os dados para o segundo programa. At a, tudo ok, porm, quando me conecto com mais de um equipamento
(utilizando um roteador), as informaes chegam ao segundo programa de forma desordenada, ele acaba linkando as
informaes do primeiro e do segundo equipamento e envia os dois ao mesmo tempo, porm no envia de forma completa.
Existe alguma soluo para este problema? No sei se fui muito claro, mas o que acontece que tenho duas mquinas
enviando dados ao mesmo tempo para outra.

Carlos Fernando Sylverio says:


12/02/2013 at 9:29 am

Marcos, vamos por partes. Esse exemplo foi simples e didtico. Ele feito de forma sincrona. Para resolver seu problema, vc
precisa criar processos de comunicao de forma assincrona. Ser bem mais complexo.
Tive um projeto similar ao seu no qual cada requisio que chegava ao socket abria uma thread para executar o processo e
liberava o socket para escutar novamenta a proxima requisio. Cada requisio que chegava ao socket ouvinte era
adicionado a uma fila para que executa-las na sequencia certa.
Deu pra perceber que a soluo do seu desenvolvimento ser mais complexa e precisar de outras tcnicas associadas ao
socket para funcionar corretamente.
Espero ter ajudado.
Abrao

Marcos Pereira de Souza says:


12/04/2013 at 10:10 am

Obrigado Carlos. Era o que estava imaginando. Vou realizar pesquisas e verificar uma outra forma de desenvolvimento
trabalhando de forma assincrona. Se tiver alguma matria para indicar ficaria novamente grato. Abraos.

Leonardo de Freitas Oliveira says:


12/16/2013 at 11:09 am

http://sylverio.com.br/blog/2009/12/comunicacao-via-socket-com-c/

6/7

02/11/2014

Comunicao via socket com C# | Sylverio

Muito bom este post, s gostaria de saber qual a diferena entre este exemplo e o da prpria MSDN que parece ser mais
complicada e indica o uso objeto Socket, que usa um objeto AsyncCallback para tornar um procedimento padro ao ser
realizada a conexo

Alisson says:
09/17/2014 at 9:41 pm

Carlos, caso eu queira executar mais de uma conexo Client:


Ol Reginaldo, no. Esse exemplo ele s possui um processo para tratar a requisio.
Para isso voc teria que criar uma Thread para tratar cada requisio de forma separada.
Como respondeu, teria que tratar cada requisio de forma separada.
Como posso fazer isso se eu tiver inmeros clientes?
Tem algum exemplo de como poderia ser esta Thread?
Muito obrigado.

Sylverio
Proudly powered by WordPress.

http://sylverio.com.br/blog/2009/12/comunicacao-via-socket-com-c/

7/7