SYSTEM.NET.SOCKETS

NILSONTRES 07/04/2016 12:01:18
#460677
Pessoal,
Peguei um exemplo do macoratti,

[ô]aceita a conexao do cliente e retorna uma inicializacao TcpClient
Dim tcpClient As TcpClient = tcpListener.AcceptTcpClient()
Label1.Text += [Ô]Conexão aceita.[Ô] & vbCrLf
[ô] obtem o stream
[ô]Dim networkStream As NetworkStream = tcpClient.GetStream()
networkSt = tcpClient.GetStream()
[ô] le o stream em um array de bytes
Dim bytes(tcpClient.ReceiveBufferSize) As Byte
networkSt.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))

[ô] Retorna os dados recebidos do cliente para o console
Dim clientdata As String = Encoding.ASCII.GetString(bytes)
Label1.Text += [Ô]Cliente enviou : [Ô] + clientdata & vbCrLf

[ô]qualquer comunicacao com o cliente remoto usando o TcpClient pode comecar aqui
Dim responseString As String = [Ô]Conectado ao servidor.[Ô]
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(responseString)
networkSt.Write(sendBytes, 0, sendBytes.Length)
Label1.Text += [Ô]Mensagem enviada /> : [Ô] + responseString & vbCrLf

[ô]fecha TcpListener e TcpClient.
[ô]tcpClient.Close()
[ô]tcpListener.Stop()
Label1.Text += [Ô]Encerrando conexão com o servidor[Ô] & vbCrLf

Essa mensagem só retorna ao cliente na primeira vez, depois não envia mais.

Se eu repetir:
Dim responseString As String = txt_msg.text
Dim sendBytes As [Byte]() = Encoding.ASCII.GetBytes(responseString)
networkSt.Write(sendBytes, 0, sendBytes.Length)

Não vai mais para o cliente.
Porque ?
NILSONTRES 07/04/2016 14:30:21
#460693
Subindo.
DS2T 07/04/2016 18:41:48
#460703
Esse exemplo ele programou só para o envio de uma mensagem. O ideal seria você usar threads para isso, porque o cliente tem que ficar verificando a todo instante o recebimento de mensagem. Ele não funciona como o winsock que tinha um evento informando o recebimento das mensagens, você tem que deixar num loop e ir verificando se recebeu pacote de bytes ou não.

Espero ter ajudado.
KERPLUNK 07/04/2016 18:53:49
#460705
Resposta escolhida
Threads e winsock são uma péssima idéia, vai por mim. Eu tentei e até funciona, mas por alguma razão a busca de valores fica muito propensa à erros.
NILSONTRES 07/04/2016 21:15:12
#460711
Citação:

O ideal seria você usar threads para isso


Mas eu estou utilizando.
Citação:

Ele não funciona como o winsock que tinha um evento informando o recebimento das mensagens, você tem que deixar num loop e ir verificando se recebeu pacote de bytes ou não.


Sera ?
Porque a primeira mensagem eu não envio como no exemplo, automaticamente logo depois da conexão, eu envio depois por um textbox e mesmo assim o cliente recebe, só não recebe depois da primeira mensagem.
Mas a primeira ele escuta sem loop de verificação.

Citação:

Threads e winsock são uma péssima idéia, vai por mim. Eu tentei e até funciona, mas por alguma razão a busca de valores fica muito propensa à erros.


Mas sem Threads deve haver travamentos, ou não ?
KERPLUNK 07/04/2016 21:39:53
#460713
O que você deve colocar na thread é o tratamento dos dados. O recebimento em si, não.
KERPLUNK 07/04/2016 21:40:22
#460714
Mas só de curioso, para que está usando sockets?
NILSONTRES 07/04/2016 23:07:51
#460723
Citação:

Mas só de curioso, para que está usando sockets?


Eu tenho meu controlador de fila de SAT para compartilhamento, mas fiz através de troca de arquivos, queria testar via socket, mas por enquanto seria para testes, já que o atual até rola, tem uma média de erro a cada 20 mil cupons, mas ainda não estou satisfeito queria erro zero.
Talvez seja mais rápida também a resposta via socket.
KERPLUNK 07/04/2016 23:55:27
#460725
Acho difícil que você consiga com sockets um desempenho melhor que simplesmente copiando arquivos pela rede. Além disso, tem todo o problema de abrir portas no firewall, NAT e tudo mais. Vai ser ainda mais propenso à falhas, na minha opinião
NILSONTRES 08/04/2016 10:22:37
#460737
Citação:

Acho difícil que você consiga com sockets um desempenho melhor que simplesmente copiando arquivos pela rede


é o que eu quero comprovar ou não.
Tópico encerrado , respostas não são mais permitidas