|
2 | 2 | using System.Collections.Generic;
|
3 | 3 | using System.Diagnostics;
|
4 | 4 | using System.Threading.Tasks;
|
| 5 | +using System.Net.WebSockets; |
| 6 | +using System.Threading; |
| 7 | +using System.Text; |
| 8 | +using System.IO; |
5 | 9 |
|
6 | 10 | namespace MildomSitePlugin
|
7 | 11 | {
|
8 |
| - /// <summary> |
9 |
| - /// |
10 |
| - /// </summary> |
11 |
| - /// <remarks>接続毎にインスタンスを作る</remarks> |
12 |
| - public class WebSocket : IWebSocket |
| 12 | + public class SytemNetWebSockets : IWebSocket |
13 | 13 | {
|
14 |
| - public event EventHandler Opened; |
15 |
| - |
16 | 14 | public event EventHandler<string> Received;
|
17 |
| - WebSocket4Net.WebSocket _ws; |
18 |
| - TaskCompletionSource<object> _tcs; |
19 |
| - private readonly string _url; |
| 15 | + public event EventHandler Opened; |
20 | 16 |
|
21 |
| - public Task ReceiveAsync() |
| 17 | + public void Disconnect() |
22 | 18 | {
|
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(); |
33 | 20 | }
|
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() |
36 | 25 | {
|
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); |
39 | 31 |
|
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 | + } |
44 | 70 |
|
45 |
| - private void _ws_Opened(object sender, EventArgs e) |
46 |
| - { |
47 |
| - Opened?.Invoke(this, e); |
| 71 | + _cts = null; |
48 | 72 | }
|
49 | 73 |
|
50 | 74 | public async Task SendAsync(string s)
|
51 | 75 | {
|
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); |
66 | 79 | }
|
67 |
| - public WebSocket(string url) |
| 80 | + public SytemNetWebSockets(string url) |
68 | 81 | {
|
69 | 82 | _url = url;
|
70 | 83 | }
|
|
0 commit comments