-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathComunicadorSocket.cs
100 lines (82 loc) · 3.16 KB
/
ComunicadorSocket.cs
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.IO;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleAppTeste
{
public class ComunicadorSocket
{
private readonly int tamanhoMaximoMensagemRecebido = 8192;
private readonly ClientWebSocket clientWebSocket;
public ComunicadorSocket(ClientWebSocket clientWebSocket)
{
this.clientWebSocket = clientWebSocket;
}
public async Task EnviarMensagem(string mensagem)
{
ArraySegment<byte> bytesParaEnviar;
bytesParaEnviar = new ArraySegment<byte>(Encoding.UTF8.GetBytes(mensagem));
await clientWebSocket.SendAsync(bytesParaEnviar, WebSocketMessageType.Text, true, CancellationToken.None);
}
public async Task<string> ReceberMensagem(int quantidadeLeitura)
{
string mensagemRecebida = string.Empty;
int tentativasFeitas;
tentativasFeitas = 0;
while (tentativasFeitas < quantidadeLeitura)
{
MemoryStream memoryStream = null;
StreamReader reader = null;
try
{
memoryStream = await IterarNoRetornoDaMensagem(clientWebSocket);
reader = new StreamReader(memoryStream, Encoding.UTF8);
mensagemRecebida = reader.ReadToEnd();
}
finally
{
LiberarRecurso(ref memoryStream, ref reader);
}
tentativasFeitas++;
}
return mensagemRecebida;
}
private async Task<MemoryStream> IterarNoRetornoDaMensagem(ClientWebSocket clientWebSocket)
{
ArraySegment<byte> bytesParaReceber;
MemoryStream memoryStream = null;
WebSocketReceiveResult retorno = null;
memoryStream = new MemoryStream();
bytesParaReceber = new ArraySegment<byte>(new byte[tamanhoMaximoMensagemRecebido]);
do
{
retorno = await clientWebSocket.ReceiveAsync(bytesParaReceber, CancellationToken.None);
if (retorno.MessageType == WebSocketMessageType.Close)
{
await clientWebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
throw new Exception("Conexão foi fechada durante recebimento de mensagem");
}
memoryStream.Write(bytesParaReceber.Array, bytesParaReceber.Offset, retorno.Count);
}
while (!retorno.EndOfMessage);
memoryStream.Seek(0, SeekOrigin.Begin);
return memoryStream;
}
private static void LiberarRecurso(ref MemoryStream memoryStream, ref StreamReader reader)
{
if (reader != null)
{
reader.Close();
reader = null;
}
if (memoryStream != null)
{
memoryStream.Flush();
memoryStream.Close();
memoryStream = null;
}
}
}
}