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()); }