Skip to content

Commit 34fbd1a

Browse files
authored
Merge pull request #163 from jlareo/master
feat: Implement the possibility to set the number of reconnect attem...
2 parents 8b9d55b + 71e0e07 commit 34fbd1a

File tree

13 files changed

+123
-133
lines changed

13 files changed

+123
-133
lines changed

src/SocketIOClient.Sample/MyConnectInterval.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
using SocketIOClient.ConnectInterval;
22
using System;
3-
using System.Collections.Generic;
4-
using System.Text;
53

64
namespace SocketIOClient.Sample
75
{
@@ -14,15 +12,15 @@ public MyConnectInterval()
1412

1513
double delay;
1614

17-
public int GetDelay()
15+
public double GetDelay()
1816
{
1917
Console.WriteLine("GetDelay: " + delay);
20-
return (int)delay;
18+
return delay;
2119
}
2220

23-
public double NextDealy()
21+
public double NextDelay()
2422
{
25-
Console.WriteLine("NextDealy: " + (delay + 1000));
23+
Console.WriteLine("NextDelay: " + (delay + 1000));
2624
return delay += 1000;
2725
}
2826
}
Lines changed: 6 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
using SocketIOClient.WebSocketClient;
2-
using System;
1+
using System;
32
using System.Collections.Generic;
43
using System.Diagnostics;
54
using System.Text;
6-
using System.Text.Json.Serialization;
75
using System.Threading.Tasks;
86

97
namespace SocketIOClient.Sample
@@ -16,24 +14,16 @@ static async Task Main(string[] args)
1614
Console.OutputEncoding = Encoding.UTF8;
1715
Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
1816

19-
//var uri = new Uri("http://localhost:11003/nsp");
20-
var uri = new Uri("http://localhost:11000");
21-
//var uri = new Uri("http://localhost:11003");
22-
//var uri = new Uri("http://jd.doghappy.wang:11000");
23-
//var uri = new Uri("https://socket-io.doghappy.wang");
17+
var uri = new Uri("http://localhost:11003");
2418

2519
var socket = new SocketIO(uri, new SocketIOOptions
2620
{
2721
Query = new Dictionary<string, string>
2822
{
29-
{"token", "io" }
30-
//{"token", "v3" }
31-
},
32-
//EIO = 4
23+
{"token", "V3" }
24+
}
3325
});
3426

35-
socket.GetConnectInterval = () => new MyConnectInterval();
36-
3727

3828
//var client = socket.Socket as ClientWebSocket;
3929
//client.Config = options =>
@@ -60,38 +50,12 @@ static async Task Main(string[] args)
6050

6151
await socket.ConnectAsync();
6252

63-
socket.On("ContinuouslyReceiveData", response =>
64-
{
65-
var data = response.GetValue<ContinuouslyReceiveData>();
66-
Console.WriteLine(data.Index);
67-
});
68-
69-
//socket.On("bytes", response =>
70-
//{
71-
// var bytes = response.GetValue<ByteResponse>();
72-
// Console.WriteLine($"bytes.Source = {bytes.Source}");
73-
// Console.WriteLine($"bytes.ClientSource = {bytes.ClientSource}");
74-
// Console.WriteLine($"bytes.Buffer.Length = {bytes.Buffer.Length}");
75-
// Console.WriteLine($"bytes.Buffer.ToString() = {Encoding.UTF8.GetString(bytes.Buffer)}");
76-
//});
77-
//socket.OnReceivedEvent += (sender, e) =>
78-
//{
79-
// if (e.Event == "bytes")
80-
// {
81-
// var bytes = e.Response.GetValue<ByteResponse>();
82-
// Console.WriteLine($"OnReceivedEvent.Source = {bytes.Source}");
83-
// Console.WriteLine($"OnReceivedEvent.ClientSource = {bytes.ClientSource}");
84-
// Console.WriteLine($"OnReceivedEvent.Buffer.Length = {bytes.Buffer.Length}");
85-
// Console.WriteLine($"OnReceivedEvent.Buffer.ToString() = {Encoding.UTF8.GetString(bytes.Buffer)}");
86-
// }
87-
//};
88-
8953
Console.ReadLine();
9054
}
9155

9256
private static void Socket_OnReconnecting(object sender, int e)
9357
{
94-
Console.WriteLine($"Reconnecting: attempt = {e}");
58+
Console.WriteLine($"{DateTime.Now} Reconnecting: attempt = {e}");
9559
}
9660

9761
private static void Socket_OnDisconnected(object sender, string e)
@@ -105,49 +69,7 @@ private static async void Socket_OnConnected(object sender, EventArgs e)
10569
var socket = sender as SocketIO;
10670
Console.WriteLine("Socket.Id:" + socket.Id);
10771

108-
await socket.EmitAsync("ContinuouslyReceiveData", new
109-
{
110-
count = 100,
111-
path = "设计表.rar"
112-
});
113-
//string path = "设计表.rar";
114-
//var bytes = System.IO.File.ReadAllBytes(path);
115-
//int i = -1;
116-
//while (true)
117-
//{
118-
// i++;
119-
// await socket.EmitAsync("items_updated", new
120-
// {
121-
// progress = i,
122-
// binary = bytes
123-
// });
124-
//}
125-
//await socket.EmitAsync("hi", "SocketIOClient.Sample");
126-
127-
128-
//await socket.EmitAsync("ack", response =>
129-
//{
130-
// Console.WriteLine(response.ToString());
131-
//}, "SocketIOClient.Sample");
132-
133-
//await socket.EmitAsync("bytes", "c#", new
134-
//{
135-
// source = "client007",
136-
// bytes = Encoding.UTF8.GetBytes("dot net")
137-
//});
138-
139-
//socket.On("client binary callback", async response =>
140-
//{
141-
// await response.CallbackAsync();
142-
//});
143-
144-
//await socket.EmitAsync("client binary callback", Encoding.UTF8.GetBytes("SocketIOClient.Sample"));
145-
146-
//socket.On("client message callback", async response =>
147-
//{
148-
// await response.CallbackAsync(Encoding.UTF8.GetBytes("CallbackAsync();"));
149-
//});
150-
//await socket.EmitAsync("client message callback", "SocketIOClient.Sample");
72+
await socket.EmitAsync("hi", "SocketIOClient.Sample");
15173
}
15274

15375
private static void Socket_OnPing(object sender, EventArgs e)
@@ -160,29 +82,4 @@ private static void Socket_OnPong(object sender, TimeSpan e)
16082
Console.WriteLine("Pong: " + e.TotalMilliseconds);
16183
}
16284
}
163-
164-
class ByteResponse
165-
{
166-
public string ClientSource { get; set; }
167-
168-
public string Source { get; set; }
169-
170-
public byte[] Buffer { get; set; }
171-
}
172-
173-
class ClientCallbackResponse
174-
{
175-
public string Text { get; set; }
176-
177-
public byte[] Bytes { get; set; }
178-
}
179-
180-
class ContinuouslyReceiveData
181-
{
182-
[JsonPropertyName("index")]
183-
public int Index { get; set; }
184-
185-
[JsonPropertyName("file")]
186-
public byte[] File { get; set; }
187-
}
18885
}

src/SocketIOClient.Test/SocketIOTests/ReconnectionTest.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,36 @@ public virtual async Task ReconnectingTest()
130130
Assert.AreEqual(1, attempt);
131131
}
132132

133+
public virtual async Task ReconnectionAttemptsExceededTest()
134+
{
135+
var client = SocketIOCreator.Create();
136+
client.ServerUri = new System.Uri("http://localhost:11011");
137+
client.Options.AllowedRetryFirstConnection = true;
138+
client.Options.ReconnectionAttempts = 5;
139+
140+
int reconnectingCount = 0;
141+
int attempt = 0;
142+
int reconnectionErrorCount = 0;
143+
144+
client.OnReconnecting += (sender, e) =>
145+
{
146+
reconnectingCount++;
147+
attempt = e;
148+
};
149+
150+
client.OnReconnectFailed += (sender, e) =>
151+
{
152+
reconnectionErrorCount++;
153+
};
154+
155+
await client.ConnectAsync();
156+
157+
Assert.AreEqual(reconnectingCount, 5);
158+
Assert.AreEqual(reconnectionErrorCount, 1);
159+
Assert.AreEqual(attempt, 5);
160+
}
161+
162+
133163
[Timeout(30000)]
134164
public virtual async Task ManuallyReconnectionTest()
135165
{

src/SocketIOClient.Test/SocketIOTests/V2/ReconnectionV2NspTest.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public override async Task ReconnectingTest()
3131
await base.ReconnectingTest();
3232
}
3333

34+
[TestMethod]
35+
public override async Task ReconnectionAttemptsExceededTest()
36+
{
37+
await base.ReconnectionAttemptsExceededTest();
38+
}
39+
3440
[TestMethod]
3541
public override async Task ManuallyReconnectionTest()
3642
{

src/SocketIOClient.Test/SocketIOTests/V2/ReconnectionV2Test.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public override async Task ReconnectingTest()
3131
await base.ReconnectingTest();
3232
}
3333

34+
[TestMethod]
35+
public override async Task ReconnectionAttemptsExceededTest()
36+
{
37+
await base.ReconnectionAttemptsExceededTest();
38+
}
39+
3440
[TestMethod]
3541
public override async Task ManuallyReconnectionTest()
3642
{

src/SocketIOClient.Test/SocketIOTests/V3/ReconnectionV3NspTest.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public override async Task ReconnectingTest()
3131
await base.ReconnectingTest();
3232
}
3333

34+
[TestMethod]
35+
public override async Task ReconnectionAttemptsExceededTest()
36+
{
37+
await base.ReconnectionAttemptsExceededTest();
38+
}
39+
3440
[TestMethod]
3541
public override async Task ManuallyReconnectionTest()
3642
{

src/SocketIOClient.Test/SocketIOTests/V3/ReconnectionV3Test.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ public override async Task ReconnectionTrueTest()
1919
await base.ReconnectionTrueTest();
2020
}
2121

22+
[TestMethod]
23+
public override async Task ReconnectionAttemptsExceededTest()
24+
{
25+
await base.ReconnectionAttemptsExceededTest();
26+
}
27+
2228
[TestMethod]
2329
public override async Task ReconnectionFalseTest()
2430
{

src/SocketIOClient.Test/SocketIOTests/V4/ReconnectionV4NspTest.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public override async Task ReconnectingTest()
3131
await base.ReconnectingTest();
3232
}
3333

34+
[TestMethod]
35+
public override async Task ReconnectionAttemptsExceededTest()
36+
{
37+
await base.ReconnectionAttemptsExceededTest();
38+
}
39+
3440
[TestMethod]
3541
public override async Task ManuallyReconnectionTest()
3642
{

src/SocketIOClient.Test/SocketIOTests/V4/ReconnectionV4Test.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ public override async Task ReconnectingTest()
3131
await base.ReconnectingTest();
3232
}
3333

34+
[TestMethod]
35+
public override async Task ReconnectionAttemptsExceededTest()
36+
{
37+
await base.ReconnectionAttemptsExceededTest();
38+
}
39+
3440
[TestMethod]
3541
public override async Task ManuallyReconnectionTest()
3642
{
Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,36 @@
1-
namespace SocketIOClient.ConnectInterval
1+
using System;
2+
3+
namespace SocketIOClient.ConnectInterval
24
{
35
class DefaultConnectInterval: IConnectInterval
46
{
57
public DefaultConnectInterval(SocketIOOptions options)
68
{
79
this.options = options;
8-
delayDouble = options.ReconnectionDelay;
10+
this.delay = options.ReconnectionDelay;
911
}
1012

1113
readonly SocketIOOptions options;
12-
double delayDouble;
14+
private double delay;
15+
private int attempts = 0;
1316

14-
public int GetDelay()
17+
public double GetDelay()
1518
{
16-
return (int)delayDouble;
19+
return this.delay;
1720
}
1821

19-
public double NextDealy()
22+
public double NextDelay()
2023
{
21-
delayDouble += 2 * options.RandomizationFactor;
22-
return delayDouble;
24+
this.delay = options.ReconnectionDelay * (long)Math.Pow(2, attempts++);
25+
26+
if (this.options.RandomizationFactor > 0)
27+
{
28+
Random random = new Random();
29+
var deviation = (long)Math.Floor(random.NextDouble() * this.options.RandomizationFactor * options.ReconnectionDelay);
30+
this.delay = ((long)Math.Floor(random.NextDouble() * 10) & 1) == 0 ? this.delay - deviation : this.delay + deviation;
31+
}
32+
33+
return this.delay;
2334
}
2435
}
2536
}

0 commit comments

Comments
 (0)