Introdução
Primeiramente vamos conceiturar o que é socket, ou soquete em portugues. De uma visão geral um soquete pode ser definido como uma tomada que designa uma cavidade ou região usada para ligar algum artifício específico.
No mundo da computação, um 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”. Para quem não lembra, ou não sabe, camada de aplicação e transporte fazem parte do modelo OSI.
Através de um socket podemos estabelecer a comunicação entre máquinas possibilitando o envio e recebimento de dados.
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.
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. 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.
No C# para se trabalhar com sockets os recursos enconstram-se no namespace System.Net.Sockets.
Implementando uma aplicação com socket
Este é um simples código de uma aplicação Client/Server utilizando socket.
Abaixo o passo a passo de criação da aplicação:
Server App
- Criar um projeto do tipo WindowsForm com o nome CommunicationSocket.
- Incluir um botão 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 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 | using System; using System.IO; using System.Net; using System.Net.Sockets; using System.Threading; using 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; 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("conexão recebida!", "Server App"); binaryWriter.Write("\nconexão 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("conexão 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
- Criar um projeto do tipo WindowsForm com o nome ClientApp.
- Incluir botão 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 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 | using System; using System.IO; using System.Net.Sockets; using System.Threading; using System.Windows.Forms; namespace ClientApplication { public partial class ClientAppForm : Form { private NetworkStream networkStream; private BinaryWriter binaryWriter; private BinaryReader binaryReader; private TcpClient tcpClient; 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 comunicação o Servidor utiliza o objeto TcpListener que fica escutando toda requisição no IP “127.0.0.1″ porta 2001.
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.
Repare que tanto 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.
Nesse exemplo utilizei MessageBox para apresentar as mensagens, pois para inseri-las em um TextBox no Form é necessário utilizar delegates e reflections, senão teremos um erro de cruzamento de Threads (Cross-thread operation not valid).
Mas isso acho que é assunto para o nosso próximo post.
Até mais

tem algum exemplo usando delegate e reflection
Dorivan não possuo, mas posso fazer sendo um dos próximos post.
Boa Documentação!!!
Ps:Caso não queiram implementar um delegate ou reflection , podem estar colocando no load do form a linha de comando.
CheckForIllegalCrossThreadCalls = false;
Vai funcionar!!
Olá Sylverio!
Primeiramento parabens pela iniciativa.
Sou Engenheiro Eletrônico 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 faço 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 atenção
Ciro Peixoto
Respondendo ao Ciro Peixoto.
No cliente, na linha tcpClient.Connect(“127.0.0.1″, 2001);, você tem que colocar o IP da máquina onde o server está em execução. Ex “192.168.1.5″.
Franciscatto