Skip to content

Commit b41e995

Browse files
committed
create NStream to be Stream extension?
1 parent 34c4479 commit b41e995

File tree

6 files changed

+68
-31
lines changed

6 files changed

+68
-31
lines changed

src/netly/NStream.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.IO;
2+
3+
namespace Netly
4+
{
5+
public static class NStream
6+
{
7+
public static byte[] GetBytes(this Stream stream)
8+
{
9+
var position = stream.Position;
10+
11+
stream.Position = 0;
12+
var bytes = new byte[stream.Length];
13+
stream.Write(bytes, 0, bytes.Length);
14+
stream.Position = position;
15+
return bytes;
16+
}
17+
18+
public static void FillWithBytes(this Stream stream, byte[] bytes)
19+
{
20+
stream.Position = 0;
21+
stream.Write(bytes, 0, bytes.Length);
22+
stream.Position = 0;
23+
}
24+
}
25+
}

src/tcp/interfaces/ITCP.ClientOn.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.IO;
23
using System.Net.Security;
34
using System.Net.Sockets;
45
using System.Security.Cryptography.X509Certificates;
@@ -9,8 +10,8 @@ public static partial class ITCP
910
{
1011
public interface ClientOn : IOn<Socket>
1112
{
12-
void Data(Action<byte[]> callback);
13-
void Event(Action<string, byte[]> callback);
13+
void Data(Action<Stream> callback);
14+
void Event(Action<string, Stream> callback);
1415
void Encryption(Func<X509Certificate, X509Chain, SslPolicyErrors, bool> callback);
1516
}
1617
}

src/tcp/partials/TCP.ClientOn.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.IO;
34
using System.Net.Security;
45
using System.Net.Sockets;
56
using System.Security.Cryptography.X509Certificates;
@@ -15,9 +16,9 @@ internal class ClientOn : ITCP.ClientOn
1516
new List<Func<X509Certificate, X509Chain, SslPolicyErrors, bool>>();
1617

1718
public EventHandler OnClose;
18-
public EventHandler<byte[]> OnData;
19+
public EventHandler<Stream> OnData;
1920
public EventHandler<Exception> OnError;
20-
public EventHandler<(string name, byte[] buffer)> OnEvent;
21+
public EventHandler<(string name, Stream buffer)> OnEvent;
2122
public EventHandler<Socket> OnModify;
2223
public EventHandler OnOpen;
2324

@@ -42,12 +43,12 @@ public void Modify(Action<Socket> callback)
4243
OnModify += (@object, e) => NDispatcher.Singleton.Submit(() => callback?.Invoke(e));
4344
}
4445

45-
public void Data(Action<byte[]> callback)
46+
public void Data(Action<Stream> callback)
4647
{
4748
OnData += (@object, e) => NDispatcher.Singleton.Submit(() => callback?.Invoke(e));
4849
}
4950

50-
public void Event(Action<string, byte[]> callback)
51+
public void Event(Action<string, Stream> callback)
5152
{
5253
OnEvent += (@object, e) => NDispatcher.Singleton.Submit(() => callback?.Invoke(e.name, e.buffer));
5354
}

src/tcp/partials/TCP.ClientTo.cs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,9 @@ public async Task Open(NHost host)
106106

107107
InitReceiver();
108108

109-
_isOpening = false; // allow client send data on OnOpen callback.
109+
_isOpening = false;
110+
111+
// allow client send data on OnOpen callback.
110112
On.OnOpen?.Invoke(null, null);
111113
}
112114
catch (Exception e)
@@ -164,7 +166,7 @@ public void Data(byte[] data)
164166
{
165167
if (CanSend == false || data == null || data.Length <= 0) return;
166168

167-
//SendDispatch(data);
169+
SendDispatch(data);
168170
}
169171

170172
public void Encryption(bool enable)
@@ -188,35 +190,40 @@ public void Data(string data)
188190
{
189191
if (CanSend == false || string.IsNullOrEmpty(data)) return;
190192

191-
// SendDispatch(data.GetBytes());
193+
SendDispatch(data.GetBytes());
192194
}
193195

194196
public void Data(string data, Encoding encoding)
195197
{
196198
if (CanSend == false || string.IsNullOrEmpty(data)) return;
197199

198-
//SendDispatch(data.GetBytes(encoding));
200+
SendDispatch(data.GetBytes(encoding));
199201
}
200202

201203
public void Event(string name, byte[] data)
202204
{
203205
if (CanSend == false || string.IsNullOrEmpty(name) || data == null || data.Length <= 0) return;
204206

205-
// SendDispatch(NetlyEnvironment.EventManager.Create(name, data));
207+
var header = NMessage.Create(name, data.LongLength);
208+
SendDispatch(header, data);
206209
}
207210

208211
public void Event(string name, string data)
209212
{
210213
if (CanSend == false || string.IsNullOrEmpty(data) || string.IsNullOrEmpty(name)) return;
211214

212-
//SendDispatch(NetlyEnvironment.EventManager.Create(name, data.GetBytes()));
215+
var bytes = data.GetBytes();
216+
var header = NMessage.Create(name, bytes.LongLength);
217+
SendDispatch(header, bytes);
213218
}
214219

215220
public void Event(string name, string data, Encoding encoding)
216221
{
217222
if (CanSend == false || string.IsNullOrEmpty(name) || string.IsNullOrEmpty(data)) return;
218223

219-
//SendDispatch(NetlyEnvironment.EventManager.Create(name, data.GetBytes(encoding)));
224+
var bytes = data.GetBytes(encoding);
225+
var header = NMessage.Create(name, bytes.LongLength);
226+
SendDispatch(header, bytes);
220227
}
221228

222229
/* ---- INTERFACE --- */
@@ -338,32 +345,35 @@ await _sslStream.AuthenticateAsServerAsync
338345

339346
private void PublishData(Stream stream)
340347
{
341-
/*
342-
if (Package.ParseMessage(bytes, out var name, out var data))
343-
On.OnEvent?.Invoke(null, (name, data));
348+
if (NMessage.TryParse(stream, out var name, out var message, NUtils.NewStream))
349+
{
350+
message.Position = 0;
351+
On.OnEvent?.Invoke(null, (name, message));
352+
}
344353
else
345-
On.OnData?.Invoke(null, bytes);*/
354+
{
355+
stream.Position = 0;
356+
On.OnData?.Invoke(null, stream);
357+
}
346358
}
347359

348-
private void SendDispatch(object package)
360+
private void SendDispatch(params byte[][] buffers)
349361
{
350-
/*
351362
if (_socket == null || _netStream == null || (IsEncrypted && _sslStream == null))
352363
{
353-
package.Clear();
354364
return;
355365
}
356366

357367
try
358368
{
359-
if (package == null || package.Count <= 0) return;
360369
var stream = IsEncrypted ? (Stream)_sslStream : (Stream)_netStream;
361-
foreach (var segment in package.Segments) stream.WriteAsync(segment, 0, segment.Length);
370+
foreach (var bytes in buffers)
371+
stream.WriteAsync(bytes, 0, bytes.Length);
362372
}
363373
catch (Exception e)
364374
{
365-
NetlyEnvironment.Logger.Create(e);
366-
}*/
375+
NLogger.Singleton.Submit(e);
376+
}
367377
}
368378

369379
private void InitReceiver()
@@ -423,7 +433,7 @@ private void ReceiveHandler(IAsyncResult result)
423433
}
424434
else
425435
{
426-
var stream = NUtils.NewStream(size);
436+
var stream = NUtils.NewStream(size);
427437
stream.Write(_buffer, 0, size);
428438
PublishData(stream);
429439
}

test/tcp/FixTcp.Broadcast.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ void Client(NHost host)
9090
client.On.Close(() => isClose = true);
9191
client.On.Error(_ => isError = true);
9292
client.On.Modify(_ => isModify = true);
93-
client.On.Data(bytes => client.To.Data(bytes));
94-
client.On.Event((name, bytes) => client.To.Event(name, bytes));
93+
client.On.Data(stream => client.To.Data(stream.GetBytes()));
94+
client.On.Event((name, stream) => client.To.Event(name, stream.GetBytes()));
9595
{
9696
Assert.False(client.IsOpened);
9797
Assert.False(isOpen);

test/tcp/FixTcp.SendAndReceive.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ async Task Server()
2828
{
2929
client.On.Data(data =>
3030
{
31-
client.To.Data(data);
31+
client.To.Data(data.GetBytes());
3232

3333
lock (dataLock)
3434
{
@@ -38,7 +38,7 @@ async Task Server()
3838

3939
client.On.Event((name, data) =>
4040
{
41-
client.To.Event(name, data);
41+
client.To.Event(name, data.GetBytes());
4242

4343
lock (eventLock)
4444
{
@@ -101,8 +101,8 @@ void Client(NHost host, out Action check)
101101
client.On.Close(() => isClose = true);
102102
client.On.Error(_ => isError = true);
103103
client.On.Modify(_ => isModify = true);
104-
client.On.Data(bytes => dataReceived.AddRange(bytes));
105-
client.On.Event((name, bytes) => eventReceived = (name, bytes));
104+
client.On.Data(stream => dataReceived.AddRange(stream.GetBytes()));
105+
client.On.Event((name, stream) => eventReceived = (name, stream.GetBytes()));
106106
{
107107
Assert.False(client.IsOpened);
108108
Assert.False(isOpen);

0 commit comments

Comments
 (0)