forked from siemens/ros-sharp
-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathWebSocketUWPProtocol.cs
117 lines (99 loc) · 3.32 KB
/
WebSocketUWPProtocol.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#if WINDOWS_UWP
using Windows.Networking.Sockets;
using Windows.Foundation;
using Windows.Web;
using Windows.Storage.Streams;
using System.Collections;
using System.Collections.Generic;
using System;
namespace RosSharp.RosBridgeClient.Protocols
{
public class WebSocketUWPProtocol : IProtocol
{
MessageWebSocket WebSocket;
Uri Url;
DataWriter MessageWriter;
public event EventHandler OnReceive;
int p = (int)Environment.OSVersion.Platform;
public WebSocketUWPProtocol(string Url)
{
this.Url = TryGetUri(Url);
WebSocket = new MessageWebSocket();
WebSocket.MessageReceived += Receive;
WebSocket.Closed += Close;
}
public bool isAlive = false;
public bool IsAlive()
{
return isAlive;
}
public void Connect()
{
WebSocket.ConnectAsync(this.Url).Completed = (source, status) =>
{
if (status == AsyncStatus.Completed)
{
MessageWriter = new DataWriter(WebSocket.OutputStream);
isAlive = true;
}
};
}
public void Close()
{
if (WebSocket != null)
{
WebSocket.Dispose();
WebSocket = null;
isAlive = false;
}
}
public async void Send(byte[] data)
{
if (WebSocket != null && MessageWriter != null)
{
try
{
MessageWriter.WriteBytes(data);
await MessageWriter.StoreAsync();
}
catch
{
return;
}
}
}
void Receive(MessageWebSocket FromSocket, MessageWebSocketMessageReceivedEventArgs InputMessage)
{
try
{
using (var reader = InputMessage.GetDataReader())
{
var messageLength = InputMessage.GetDataReader().UnconsumedBufferLength;
byte[] receivedMessage = new byte[messageLength];
reader.UnicodeEncoding = UnicodeEncoding.Utf8;
reader.ReadBytes(receivedMessage);
OnReceive.Invoke(this, new MessageEventArgs(receivedMessage));
}
}
catch
{
return;
}
}
static System.Uri TryGetUri(string uriString)
{
Uri webSocketUri;
if (!Uri.TryCreate(uriString.Trim(), UriKind.Absolute, out webSocketUri))
throw new System.Exception("Error: Invalid URI");
// Fragments are not allowed in WebSocket URIs.
if (!String.IsNullOrEmpty(webSocketUri.Fragment))
throw new System.Exception("Error: URI fragments not supported in WebSocket URIs.");
// Uri.SchemeName returns the canonicalized scheme name so we can use case-sensitive, ordinal string
// comparison.
if ((webSocketUri.Scheme != "ws") && (webSocketUri.Scheme != "wss"))
throw new System.Exception("Error: WebSockets only support ws:// and wss:// schemes.");
return webSocketUri;
}
}
};
#endif