Skip to content

Commit 0aa5494

Browse files
committed
Передача размера в сообщении JSON
1 parent 8cf0490 commit 0aa5494

2 files changed

Lines changed: 43 additions & 10 deletions

File tree

src/OneScript.DebugProtocol/TcpServer/JsonDtoChannel.cs

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,22 @@ public void Write(object data)
4545
if (!_enabled)
4646
throw new ObjectDisposedException(nameof(JsonDtoChannel));
4747

48-
using var streamWriter = new StreamWriter(_dataStream, Encoding.UTF8, 1024, leaveOpen: true);
49-
using var writer = new JsonTextWriter(streamWriter);
48+
var content = JsonConvert.SerializeObject(data);
49+
var contentBytes = Encoding.UTF8.GetBytes(content);
5050

51-
JsonSerializer.CreateDefault().Serialize(writer, data);
52-
writer.Flush();
53-
}
51+
using (var bufferedStream = new MemoryStream(contentBytes.Length + sizeof(int)))
52+
{
53+
using (var writer = new BinaryWriter(bufferedStream, Encoding.UTF8))
54+
{
55+
writer.Write(contentBytes.Length);
56+
writer.Write(contentBytes, 0, contentBytes.Length);
5457

58+
bufferedStream.Position = 0;
59+
bufferedStream.CopyTo(_dataStream);
60+
}
61+
}
62+
}
63+
5564
public T Read<T>()
5665
{
5766
return (T)Read();
@@ -61,13 +70,36 @@ public object Read()
6170
{
6271
if (!_enabled)
6372
throw new ObjectDisposedException(nameof(JsonDtoChannel));
64-
65-
using var streamReader = new StreamReader(_dataStream, Encoding.UTF8, false, 1024, leaveOpen: true);
66-
using var reader = new JsonTextReader(streamReader);
6773

68-
return JsonSerializer.CreateDefault().Deserialize<TcpProtocolDtoBase>(reader);
74+
using (var socketReader = new BinaryReader(_dataStream, Encoding.UTF8, true))
75+
{
76+
var contentLength = socketReader.ReadInt32();
77+
var contentBuffer = new byte[contentLength];
78+
ReadStream(socketReader, contentBuffer, contentLength);
79+
80+
using (var textReader = new StreamReader(new MemoryStream(contentBuffer), Encoding.UTF8, false))
81+
{
82+
using var reader = new JsonTextReader(textReader);
83+
return JsonSerializer.CreateDefault().Deserialize<TcpProtocolDtoBase>(reader);
84+
}
85+
}
6986
}
7087

88+
private void ReadStream(BinaryReader reader, byte[] buffer, int length)
89+
{
90+
int readPosition = 0;
91+
int bytesReceived = 0;
92+
93+
while (bytesReceived < length)
94+
{
95+
bytesReceived = reader.Read(buffer, readPosition, length - bytesReceived);
96+
if (bytesReceived == 0)
97+
throw new IOException("Unexpected end of stream");
98+
99+
readPosition += bytesReceived;
100+
}
101+
}
102+
71103
public bool Connected => _enabled && (_tcpClient?.Connected ?? true);
72104
}
73105
}

src/OneScript.DebugServices/Internal/DelayedConnectionChannel.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ internal class DelayedConnectionChannel : ICommunicationChannel
2222

2323
// NB! должен быть согласован с перечислением TransportProtocols в адаптере
2424
private const short JSON_FORMAT_MARKER = 2;
25-
private const short SUPPORTED_FORMAT_VERSION = 4;
25+
// NB! должен быть согласован с файлом ProtocolVersions в адаптере
26+
private const short SUPPORTED_FORMAT_VERSION = 3;
2627

2728
private bool _reconciled;
2829

0 commit comments

Comments
 (0)