Para criação desse exemplo foi utilizado o Visual Studio 2008. O objetivo deste post é mostrar como é muito simples criar esse tipo de aplicação utilizando a plataforma .NET . Com o uso das classes do namespace System.Net.Sockets temos praticamente todos os recursos necessários para desenvolver a aplicação. Nesta primeira parte é criado a aplicação servidor, para isto crie um novo projeto do tipo Windows Forms e de o nome de Win_App_Server.
private delegate void MessageInformation();
private Thread readThread;
private Socket connection;
private NetworkStream socketStream;
private BinaryWriter writer;
private BinaryReader reader;
private const int PORT = 5000;
private string theReply = string.Empty;
readThread: É uma thread que fica executando um loop infinito aguardando uma conexão de algum cliente.
connection: Cria um socket para haver comunicação entre cliente e servidor.
socketStream: Cria um canal de comunicação para escrita e leitura.
wirter: permite escrever dados no canal de comunicação entre o cliente e o servidor.
reader: permite ler dados do canal de comunição entre o cliente e o servidor.
PORT: porta do servidor que é aberta para a comunicação.
No construtor do formulario acrescente o seguinte código:
public frmServidor()
{
InitializeComponent();
readThread = new Thread(new ThreadStart(RunServer));
readThread.Start();
}
Com este código a thread readThread inicializar o servidor chamando o método RunServer().
private void RunServer()
{
try
{
TcpListener tcpListener;
MessageInformation msgInformation;
int counter = 1;
tcpListener = new TcpListener(PORT);
tcpListener.Start();
while (true)
{
msgInformation = new MessageInformation(MsgWaitConnection);
txtDisplay.Invoke(msgInformation);
connection = tcpListener.AcceptSocket();
socketStream = new NetworkStream(connection);
writer = new BinaryWriter(socketStream);
reader = new BinaryReader(socketStream);
msgInformation = new MessageInformation(MsgClientConnected);
txtDisplay.Invoke(msgInformation);
writer.Write("\r\nConexão aceita");
do
{
try
{
theReply = reader.ReadString();
msgInformation = new MessageInformation(ReplyMessage);
txtDisplay.Invoke(msgInformation);
}
catch (Exception ex)
{
break;
}
}
while(theReply != "CLIENTE>>TERMINATE" && connection.Connected);
msgInformation = new MessageInformation(ClienteClose);
txtDisplay.Invoke(msgInformation);
writer.Close();
reader.Close();
socketStream.Close();
connection.Close();
++counter;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
O método RunServer começa com a declaração de tres variaveis:
tcpListener: coloca o servidor e modo de escuta.
msgInformation: É uma variavel da delgação declarada mais acima, ela é nesessaria para poder utilzar o metodo Invoke do txtDisplay, porque a mensagens serão escritas pela readThread e não pela thread principal.
counter: Conta a quantidade de clientes que estão conectados no servidor.
tcpListener = new TcpListener(PORT);
tcpListener.Start();
Depois tcpListener é instânciado passando a porta em que o servidor estará escutando. E logo em seguida é o servidor entra em modo de escuta.
while (true)
{
msgInformation = new MessageInformation(MsgWaitConnection);
txtDisplay.Invoke(msgInformation);
connection = tcpListener.AcceptSocket();
socketStream = new NetworkStream(connection);
writer = new BinaryWriter(socketStream);
reader = new BinaryReader(socketStream);
msgInformation = new MessageInformation(MsgClientConnected);
txtDisplay.Invoke(msgInformation);
writer.Write("\r\nConexão aceita");
do
{
try
{
theReply = reader.ReadString();
msgInformation = new MessageInformation(ReplyMessage);
txtDisplay.Invoke(msgInformation);
}
catch (Exception ex)
{
break;
}
}
while(theReply != "CLIENTE>>TERMINATE" && connection.Connected);
msgInformation = new MessageInformation(ClienteClose);
txtDisplay.Invoke(msgInformation);
writer.Close();
reader.Close();
socketStream.Close();
connection.Close();
++counter;
}
O servidor agora se encontra em modo de escuta e entra em um loop infinito e fica aguardando uma conexão de algum cliente.
msgInformation = new MessageInformation(MsgWaitConnection);
txtDisplay.Invoke(msgInformation);
txtDisplay.Invoke(msgInformation);
Esta linha instancia um obejto da delegação MessageInfomation e invoca o método para escrever no txtDisplay.
connection = tcpListener.AcceptSocket();
socketStream = new NetworkStream(connection);
writer = new BinaryWriter(socketStream);
reader = new BinaryReader(socketStream);
msgInformation = new MessageInformation(MsgClientConnected);
txtDisplay.Invoke(msgInformation);
writer.Write("\r\nConexão aceita");
Neste trecho de código quando o cliente conecta no servidor a conexão é aceita e um socket é retornado.
Um canal de comunição é aberto entre o cliente e o servidor.
O canal passa a ter permissão para escrita e leitura.
Uma mensagem é escrita no canal de comunicação.
do
{
try
{
theReply = reader.ReadString();
msgInformation = new MessageInformation(ReplyMessage);
txtDisplay.Invoke(msgInformation);
}
catch (Exception ex)
{
break;
}
}
while(theReply != "CLIENTE>>TERMINATE" && connection.Connected);
{
try
{
theReply = reader.ReadString();
msgInformation = new MessageInformation(ReplyMessage);
txtDisplay.Invoke(msgInformation);
}
catch (Exception ex)
{
break;
}
}
while(theReply != "CLIENTE>>TERMINATE" && connection.Connected);
Enquanto o cliente estiver conectado ou não pedir o encerramento da conexão o servidor ler as mensagem enviadas para o servidor e exibe na tela.
msgInformation = new MessageInformation(ClienteClose);
txtDisplay.Invoke(msgInformation);
writer.Close();
reader.Close();
socketStream.Close();
connection.Close();
++counter;
}
Após a finalização da conexão é exibida uma mensagem na tela informado que o cliente se encontra desconectado. E o método RunServer é encerrado.
private void MsgWaitConnection()
{
txtDisplay.Text = "Esperando por conexão\r\n";
}
private void MsgClientConnected()
{
txtDisplay.Text += string.Concat("\r\nConexão ", connection, " recebida.");
}
private void ReplyMessage()
{
txtDisplay.Text += string.Concat("\r\n", theReply);
}
private void ClienteClose()
{
txtDisplay.Text += "\r\nSERVER>>Cliente encerrou a conexão.";
}
Esses são os métodos para exibir as mensgens no servidor, são invocado utilizando uma delegação porque são utilizados fora da thread principal.
private void txtInput_KeyDown(object sender, KeyEventArgs e)
{
try
{
if (e.KeyCode == Keys.Enter && connection != null)
{
writer.Write(string.Concat("\r\nSERVER>>", txtInput.Text));
txtDisplay.Text += string.Concat("\r\nSERVER>>", txtInput.Text);
if (txtInput.Text == "TERMINATE")
{
connection.Close();
txtDisplay.Text += string.Concat("\r\nSERVER>>", "Serverdor foi desligado.");
}
}
}
catch (Exception ex)
{
txtErros.Text = ex.Message;
}
}
No evento KeyDown da caixa de texto txtInput acrescente o código acima, ele permite que uma mensagem seja escrita no canal de comunicação e envida para o cliente.
Com estes passos a codificação do servidor termina. No próximo post será dedicado a criação da aplicação cliente.
2 comentários:
parabens primooo...continue assim que vc irá longe...e eu estarei sempre na arquibancada da vida torcendo por vc viu...bjs te amo ass: Telma
Parabens pelo Post.....
ah...Vc postou a Aplicacao Cliente??
Nao Encontrei!!
Postar um comentário