Skip to content

Commit 89bb3c5

Browse files
committed
Mildomで使用するwebsocketクライアントをSystem.Net.Websocketsのものに置き換えた
1 parent 8a0b423 commit 89bb3c5

File tree

3 files changed

+62
-48
lines changed

3 files changed

+62
-48
lines changed

MildomSitePlugin/MildomCommentProvider.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ private async Task ConnectInternalAsync(string input, IBrowserProfile browserPro
8989
//TODO:websocketUrlをAPI経由で取得する
9090
//https://im.mildom.com/?room_id=10045175&type=chat&call=get_server&cluster=aws_japan
9191
var websocketUrl = "wss://jp-room1.mildom.com/?roomId=" + roomId;
92-
var p1 = new MessageProvider(new WebSocket(websocketUrl), _logger);
92+
var p1 = new MessageProvider(new SytemNetWebSockets(websocketUrl), _logger);
9393
p1.MessageReceived += P1_MessageReceived;
9494
p1.MetadataUpdated += P1_MetadataUpdated;
9595
//var p2 = new MetadataProvider2(_server, _siteOptions);

MildomSitePlugin/WebSocket.cs

+60-47
Original file line numberDiff line numberDiff line change
@@ -2,69 +2,82 @@
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.Threading.Tasks;
5+
using System.Net.WebSockets;
6+
using System.Threading;
7+
using System.Text;
8+
using System.IO;
59

610
namespace MildomSitePlugin
711
{
8-
/// <summary>
9-
///
10-
/// </summary>
11-
/// <remarks>接続毎にインスタンスを作る</remarks>
12-
public class WebSocket : IWebSocket
12+
public class SytemNetWebSockets : IWebSocket
1313
{
14-
public event EventHandler Opened;
15-
1614
public event EventHandler<string> Received;
17-
WebSocket4Net.WebSocket _ws;
18-
TaskCompletionSource<object> _tcs;
19-
private readonly string _url;
15+
public event EventHandler Opened;
2016

21-
public Task ReceiveAsync()
17+
public void Disconnect()
2218
{
23-
_tcs = new TaskCompletionSource<object>();
24-
var cookies = new List<KeyValuePair<string, string>>();
25-
_ws = new WebSocket4Net.WebSocket(_url, "", cookies);
26-
_ws.MessageReceived += _ws_MessageReceived;
27-
//_ws.NoDelay = true;
28-
_ws.Opened += _ws_Opened;
29-
_ws.Error += _ws_Error;
30-
_ws.Closed += _ws_Closed;
31-
_ws.Open();
32-
return _tcs.Task;
19+
_cts?.Cancel();
3320
}
34-
35-
private void _ws_Closed(object sender, EventArgs e)
21+
ClientWebSocket _ws;
22+
private readonly string _url;
23+
private CancellationTokenSource _cts;
24+
public async Task ReceiveAsync()
3625
{
37-
_tcs.TrySetResult(null);
38-
}
26+
if (_cts != null) return;
27+
_cts = new CancellationTokenSource();
28+
_ws = new ClientWebSocket();
29+
await _ws.ConnectAsync(new Uri(_url), _cts.Token);
30+
Opened?.Invoke(this, EventArgs.Empty);
3931

40-
private void _ws_Error(object sender, SuperSocket.ClientEngine.ErrorEventArgs e)
41-
{
42-
_tcs.TrySetException(e.Exception);
43-
}
32+
var buf = new byte[4096];
33+
var arr = new ArraySegment<byte>(buf);
34+
int count = 0;
35+
MemoryStream ms=new MemoryStream();
36+
while (true)
37+
{
38+
var result = await _ws.ReceiveAsync(arr, _cts.Token);
39+
if(result.MessageType == WebSocketMessageType.Close)
40+
{
41+
break;
42+
}
43+
else if(result.MessageType == WebSocketMessageType.Text)
44+
{
45+
if (result.EndOfMessage)
46+
{
47+
string s;
48+
if (count == 0)
49+
{
50+
s = Encoding.UTF8.GetString(buf, 0, result.Count);
51+
}
52+
else
53+
{
54+
ms.Write(buf, 0, result.Count);
55+
var k = ms.ToArray();
56+
s = Encoding.UTF8.GetString(k, 0, k.Length);
57+
ms = new MemoryStream();
58+
count = 0;
59+
}
60+
Received?.Invoke(this, s);
61+
62+
}
63+
else
64+
{
65+
ms.Write(buf, 0, result.Count);
66+
count++;
67+
}
68+
}
69+
}
4470

45-
private void _ws_Opened(object sender, EventArgs e)
46-
{
47-
Opened?.Invoke(this, e);
71+
_cts = null;
4872
}
4973

5074
public async Task SendAsync(string s)
5175
{
52-
Debug.WriteLine("send: " + s);
53-
await Task.Yield();
54-
_ws.Send(s);
55-
}
56-
57-
private void _ws_MessageReceived(object sender, WebSocket4Net.MessageReceivedEventArgs e)
58-
{
59-
Received?.Invoke(this, e.Message);
60-
}
61-
62-
public void Disconnect()
63-
{
64-
_ws?.Close();
65-
_ws = null;
76+
if (_ws == null || _cts == null) return;
77+
var buf = Encoding.UTF8.GetBytes(s);
78+
await _ws.SendAsync(new ArraySegment<byte>(buf), WebSocketMessageType.Text, true, _cts.Token);
6679
}
67-
public WebSocket(string url)
80+
public SytemNetWebSockets(string url)
6881
{
6982
_url = url;
7083
}

SitePluginCommon/AutoReconnection/ConnectionManager.cs

+1
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ private async Task FinishProviderAsync(List<IProvider> providers, IProvider prov
8585
provider.Stop();
8686
await provider.Work;
8787
}
88+
catch (OperationCanceledException) { }
8889
catch (Exception ex)
8990
{
9091
_logger.LogException(ex);

0 commit comments

Comments
 (0)