Comunicação TCP Cliente para Servidor

Tudo que estou procurando é um exemplo simples de TCPClient / Listner no Windows Form VB.Net. Eu sou um novato e exemplos de class Microsoft TCPClient / Listner não são o que estou procurando. Tudo o que estou procurando é que o TCPClient envie uma mensagem e que um TCPListener receba a mensagem e envie a mensagem “Recebi sua mensagem”?

Uma pequena ajuda seria ótima. Eu tenho alguns códigos, mas é apenas para enviar mensagem para o servidor e não voltar do servidor para o cliente .. Qualquer ajuda será muito apreciada ..

A comunicação TCP é chamada de stream-based, o que significa que não manipula nenhum pacote. Devido a essas mensagens recebidas, elas podem ser parciais ou agrupadas.

Você poderia, por exemplo, enviar:

Hello!

How are you?

Mas você pode receber:

Hello!How are you?

ou:

Hello!How ar

e you?

(ou algo similar)

Para corrigir isso, você deve aplicar algo chamado “prefixos de comprimento” . Prefixo de comprimento (ou prefixos de comprimento) significa que, antes de enviar uma mensagem, você coloca o comprimento (quantidade de caracteres) no início dela. Isso pode então ser lido pelo ponto final, que então lerá cada mensagem de acordo com seu comprimento, portanto, não haverá problemas com mensagens parciais ou mensagens agrupadas.

Esta não é a coisa mais simples de fazer, mas eu criei duas classs que farão tudo isso por você. Veja os exemplos abaixo sobre como usá-los para uma comunicação simples baseada em mensagens.

Link para a fonte: http://www.mydoomsite.com/sourcecodes/ExtendedTcpClient.zip

Link para o código-fonte C #: http://www.mydoomsite.com/sourcecodes/ExtendedTcpClient%20CSharp.zip

Exemplo de uso

Observe que nesses exemplos o Client não se refere ao lado do cliente , mas ao TcpClient .

Lado do servidor

  1. Primeiro, declare uma nova variável para ExtendedTcpClient e inclua WithEvents na declaração.

     Dim WithEvents Client As ExtendedTcpClient 
  2. Em seguida, você precisará de um TcpListener e um Timer para verificar se há conexões de input.

     Dim Listener As New TcpListener("0.0.0.0", 5555) 'Listen for any connection on port 5555. Dim WithEvents Tmr As New System.Windows.Forms.Timer 
  3. Então você precisa se inscrever no evento Tick do timer.

     Private Sub Tmr_Tick(sender As System.Object, e As System.EventArgs) Handles Tmr.Tick End Sub 

    Lá você verifica as conexões de input através do método Listener.Pending() . Quando você for aceitar uma conexão, primeiro declare uma nova instância do ExtendedTcpClient . A class requer ter um formulário como seu dono, neste aplicativo Me sou o formulário atual.
    Em seguida, você usa o método ExtendedTcpClient.SetNewClient() com Listener.AcceptTcpClient() como seu argumento para aplicar o TcpClient do ouvinte. Coloque este código no sub- Tmr_Tick :

     If Listener.Pending() = True Then Client = New ExtendedTcpClient(Me) Client.SetNewClient(Listener.AcceptTcpClient()) End If 

    Agora o cliente e o servidor estão conectados uns aos outros.

  4. Agora você precisa se inscrever no evento PacketReceived do cliente. Crie um sub como assim:

     Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived End Sub 

    Todos os dados recebidos são apresentados em uma matriz de bytes. No sub PacketReceived você pode enviar o pacote recebido como texto para um TextBox . Apenas verifique se o header do pacote é PlainText e então você pode converter o conteúdo dos pacotes recebidos (que é uma matriz de bytes, acessados ​​via e.Packet.Contents ) para uma string e colocá-la na TextBox .

     If e.Packet.Header = TcpMessagePacket.PacketHeader.PlainText Then TextBox1.AppendText("Message recieved: " & System.Text.Encoding.Default.GetString(e.Packet.Contents) & Environment.NewLine) End If 

    System.Text.Encoding.Default.GetString() converterá uma matriz de bytes em texto normal.

  5. No sub PacketReceived você também pode enviar “Message received” para o cliente.

     Dim ResponsePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes("Message received."), TcpMessagePacket.PacketHeader.PlainText) ResponsePacket.Send(Client.Client) 'Get the ExtendedTcpClient's underlying TcpClient. 
  6. Por fim, ao fechar o formulário, basta desconectar o cliente.

     Private Sub ServerWindow_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If Client IsNot Nothing Then Client.Disconnect() End Sub 

E é isso para o lado do servidor.


Lado do cliente

  1. Para o lado do cliente, você fará praticamente o mesmo que o lado do servidor, embora você não precise de um TcpListener nem de um Timer .

     Dim Client As New ExtendedTcpClient(Me) 'The current form as it's owner. 
  2. Conecte-se ao servidor através do IP e da porta que você forneceu ao ouvinte.

     Client.Connect("127.0.0.1", 5555) 'Connects to localhost (your computer) at port 5555. 
  3. Agora, se você quiser enviar um texto para o servidor, você faria algo assim (por exemplo, um botão):

     Dim MessagePacket As New TcpMessagePacket(System.Text.Encoding.Default.GetBytes(TextBox2.Text), TcpMessagePacket.PacketHeader.PlainText) MessagePacket.Send(Client.Client) 

    TextBox2 inclui o texto que você deseja enviar.

  4. Por fim, você também precisará assinar o evento PacketReceived para verificar as respostas do servidor. Lá você recebe um texto como o servidor.

     Private Sub Client_PacketReceived(sender As Object, e As ExtendedTcpClient.PacketReceivedEventArgs) Handles Client.PacketReceived If e.Packet.Header = TcpMessagePacket.PacketHeader.PlainText Then TextBox1.AppendText(System.Text.Encoding.Default.GetString(e.Packet.Contents) & Environment.NewLine) 'Prints for example "Message received." from the server. End If End Sub 

E agora tudo deve estar funcionando!

Link para um projeto de exemplo completo (somente client-to-server): http://www.mydoomsite.com/sourcecodes/TCP%20Messaging%20System.zip

Link para o exemplo C #: http://www.mydoomsite.com/sourcecodes/CSharp%20TCP%20Messaging%20System.zip

Se você quiser adicionar mais headers à class (os headers indicam a você que tipo de pacote é), basta abrir o TcpMessagePacket.vb e adicionar mais valores no enum PacketHeader (localizado na região chamada Constants ).

Espero que isto ajude!


Captura de canvas do projeto de exemplo

(Clique na imagem para aumentar a resolução)

Saída do projeto de exemplo ExtendedTcpClient