public async static Task <Message> GetAsync(NeoSocket neoSocket) { var message = new Message(); var ms = message.ms; ms.SetLength(0); var first = true; var size = 4; var buffer = new byte[1024]; while (ms.Length < size) { var block = await neoSocket.ReadAsync(buffer, 0, (int)Math.Min(buffer.Length, size - ms.Length)); ms.Write(buffer, 0, block); if ((first) && (ms.Length == size)) { first = false; size = BitConverter.ToInt32(ms.GetBuffer(), 0); } } ms.Position = 4; return(message); }
async void Reader(NeoSocket neoSocket, AsyncQueue <byte[]> queue) { try { while (neoSocket.Connected) { var webRequest = await WebRequest.GetAsync(neoSocket); string localPath = webRequest.RequestUri.LocalPath; switch (localPath) { case "/": SendIndex(queue); break; case "/NeoRemote.apk": SendAPK(queue); break; case "/favicon.ico": SendFavicon(queue); break; case "/RunNeoRemote": await RunNeoRemote(neoSocket, queue); break; default: throw new Exception("Invalid query"); } } } catch { } neoSocket.Close(); queue.SetFinished(); }
async void Writer(NeoSocket neoSocket, AsyncQueue <byte[]> queue) { try { while (await queue.HasItemsAsync()) { var buffer = queue.Dequeue(); await neoSocket.WriteAsync(buffer, 0, buffer.Length); } } catch { queue.SetFinished(); } finally { neoSocket.Close(); } }
async Task RunNeoRemote(NeoSocket neoSocket, AsyncQueue <byte[]> queue) { neoRemoteQueues.Add(queue); try { OnConnect?.Invoke(queue); while (true) { var message = await Message.GetAsync(neoSocket); OnMessage?.Invoke(message, queue); } } finally { neoRemoteQueues.Remove(queue); } }
async void RunBluetoothListener() { BluetoothListener listener; try { listener = new BluetoothListener(new Guid("{05e9b9dd-1688-4785-bb1d-1c750034157b}")); listener.Start(); } catch { MessageBox.Show($"Unable to connect to bluetooth"); return; } while (true) { var neoSocket = new NeoSocket(await Task.Run(() => listener.AcceptBluetoothClient())); var queue = new AsyncQueue <byte[]>(); Reader(neoSocket, queue); Writer(neoSocket, queue); } }
async void RunTcpListener(int port) { TcpListener listener; try { listener = new TcpListener(IPAddress.Any, port); listener.Start(); } catch { MessageBox.Show($"Unable to connect to port {port}"); return; } while (true) { var neoSocket = new NeoSocket(await listener.AcceptTcpClientAsync()); var queue = new AsyncQueue <byte[]>(); Reader(neoSocket, queue); Writer(neoSocket, queue); } }