public void Close()
        {
            try
            {
                if (_client != null)
                {
                    _client.ReceivedMessage -= _client_ReceivedMessage;
                    _client.WebSocketClosed -= _client_WebSocketClosed;
                    _client.WebSocketFailed -= _client_WebSocketFailed;
                    _client.WebSocketOpened -= _client_WebSocketOpened;

                    if (_client.ReadyState == ReadyState.Open)
                    {
                        _client.Close();
                    }

                    _client.Dispose();
                    _client = null;

                    var ev = OnClosed;
                    if (ev != null)
                    {
                        ev();
                    }
                }
            }
            catch (Exception ex)
            {
                OnError(ex.Message);
            }
        }
		partial void ConnectButtonClicked (UIButton sender)
		{
			var url = locationTextField.Text;

			if (webSocket == null || webSocket.ReadyState == ReadyState.Closed) {
				webSocket = new WebSocket (new NSUrl (url));
				webSocket.ReceivedMessage += (_, e) => {
					logTextField.Text += string.Format ("Received message: '{1}'{0}", Environment.NewLine, e.Message);
				};
				webSocket.ReceivedPong += (_, e) => {
					logTextField.Text += string.Format ("Received pong.{0}", Environment.NewLine);
				};
				webSocket.WebSocketClosed += (_, e) => {
					logTextField.Text += string.Format ("Disconnected: '{1}' ({2}).{0}", Environment.NewLine, e.Reason, e.Code);
					UpdateUI (webSocket.ReadyState);
				};
				webSocket.WebSocketFailed += (_, e) => {
					logTextField.Text += string.Format ("Failed to connect: {1}.{0}", Environment.NewLine, e.Error);
					UpdateUI (webSocket.ReadyState);
				};
				webSocket.WebSocketOpened += (_, e) => {
					logTextField.Text += string.Format ("Connected to '{1}'.{0}", Environment.NewLine, url);
					UpdateUI (webSocket.ReadyState);
				};
				logTextField.Text += string.Format ("Connecting to '{1}'...{0}", Environment.NewLine, url);
				webSocket.Open ();
			} else if (webSocket.ReadyState == ReadyState.Open) {
				logTextField.Text += string.Format ("Disconnecting...{0}", Environment.NewLine);
				webSocket.Close ();
			}
			UpdateUI (webSocket.ReadyState);
		}
        public void Open(string url, string protocol = null, string authToken = null)
        {
            try
            {
                if (_client != null)
                    Close();

                NSUrlRequest req = new NSUrlRequest(new NSUrl(url));
                if (!string.IsNullOrEmpty(authToken))
                {
                    NSMutableUrlRequest mutableRequest = new NSMutableUrlRequest(new NSUrl(url));
                    mutableRequest["Authorization"] = authToken;
                    req = (NSUrlRequest)mutableRequest.Copy();
                }

                if (string.IsNullOrEmpty(protocol))
                    _client = new WebSocket(req);
                else
                    _client = new WebSocket(req, new NSObject[] { new NSString(protocol) });

                _client.ReceivedMessage += _client_ReceivedMessage;
                _client.WebSocketClosed += _client_WebSocketClosed;
                _client.WebSocketFailed += _client_WebSocketFailed;
                _client.WebSocketOpened += _client_WebSocketOpened;

                _client.Open();
            }
            catch (Exception ex)
            {
                OnError(ex.Message);
            }
        }