IEnumerator PollImage()
        {
            while (true)
            {
                if (string.IsNullOrEmpty(Host))
                {
                    yield return(null);
                }
                else
                {
                    var data = new RequestImageJSon();

                    if (_lowQuality)
                    {
                        data.w = Screen.width / 4;
                        data.h = Screen.height / 4;
                    }
                    else
                    {
                        data.w = Screen.width;
                        data.h = Screen.height;
                    }

                    data.p = Camera.main.transform.position;
                    data.r = Camera.main.transform.eulerAngles;
                    data.m = Camera.main.projectionMatrix;
                    data.f = !SimpleWebXR.InSession && _followMode;

#if UNITY_EDITOR
                    data.t = SimulateTouch;
#else
                    data.t = SimpleWebXR.InSession && Input.touchCount > 0;
#endif

                    var json = JsonUtility.ToJson(data);

                    if (websocket != null && websocket.State == WebSocketState.Open)
                    {
                        websocket.SendText(json);
                    }
                }

                yield return(new WaitForSeconds(0.1f));
            }
        }
        // Start is called before the first frame update
        void Start()
        {
            System.Threading.Tasks.Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    Socket listeningSocket = null;
                    try
                    {
                        listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        listeningSocket.SendBufferSize = 65536;
                        listeningSocket.Bind(new IPEndPoint(IPAddress.Any, port: 8090));
                        listeningSocket.Listen(0);

                        _ws = listeningSocket.Accept();
                        Debug.Log("A client connected.");

                        var receivedData       = new byte[100000];
                        var receivedDataLength = _ws.Receive(receivedData);

                        var requestString = Encoding.UTF8.GetString(receivedData, 0, receivedDataLength);

                        if (requestString.StartsWith("GET"))
                        {
                            var receivedWebSocketKey = _headerSecWebSocketKey.Match(requestString).Groups[1].Value.Trim();
                            var keyHash = SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes($"{receivedWebSocketKey}258EAFA5-E914-47DA-95CA-C5AB0DC85B11"));

                            var header = new StringBuilder();
                            header.Append("HTTP/1.1 101 Switching Protocols\r\n");
                            header.Append("Connection: Upgrade\r\n");
                            header.Append("Upgrade: websocket\r\n");
                            header.Append("Sec-WebSocket-Accept: ");
                            header.Append(Convert.ToBase64String(keyHash));
                            header.Append("\r\n\r\n");

                            var responseBytes = Encoding.UTF8.GetBytes(header.ToString());

                            lock (_wsLock) _ws.Send(responseBytes);
                        }

                        while (true)
                        {
                            _wsReady = true;

                            _ws.Receive(receivedData);

                            if ((receivedData[0] & (byte)Opcode.CloseConnection) == (byte)Opcode.CloseConnection)
                            {
                                // Close connection request.
                                Debug.Log("Client disconnected.");
                                CloseWebSocket(listeningSocket);
                                break;
                            }
                            else
                            {
                                var receivedPayload = ParsePayloadFromFrame(receivedData);
                                var receivedString  = Encoding.UTF8.GetString(receivedPayload);

                                try
                                {
                                    _requestData = JsonUtility.FromJson <RequestImageJSon>(receivedString);
                                }
                                catch
                                {
                                    _requestData = null;
                                }
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        if (!(e is SocketException) || (e as SocketException).ErrorCode != 10048)
                        {
                            Debug.LogException(e);
                        }
                    }
                    finally
                    {
                        _wsReady = false;
                        CloseWebSocket(listeningSocket);
                    }

                    // Wait between 2 connexions
                    Thread.Sleep(1000);
                }
            });

            StartCoroutine(RenderInTexture());
        }