示例#1
0
        private static IEnumerable<ulong> HandleRequests(ThreadManager TM, TcpClient client)
        {
            var currentThread = TM.CurrentThread;
            using (var stream = client.GetStream())
            {
                var bytes = new byte[256];
                var builder = new StringBuilder();
                int bytesRead;
                var encoder = new ASCIIEncoding();
                while (true)
                {
                    yield return TM.WaitForStream(currentThread, stream, bytes, 256);
                    try
                    {
                        bytesRead = TM.GetResult<int>();
                    }
                    catch
                    {
                        break;
                    }
                    if (bytesRead == 0)
                        break;

                    string requestStr = encoder.GetString(bytes, 0, bytesRead);
                    ClientRequest request = null;
                    bool deserializeException = false;
                    try
                    {
                        request = requestStr.Deserialize<ClientRequest>();
                    }
                    catch (Exception ex)
                    {
                        var a = ex;
                        deserializeException = true;
                    }
                    JsonObject response;
                    if (!deserializeException)
                    {
                        if (requestMethods.ContainsKey(request.Request))
                        {
                            yield return TM.Await(currentThread, requestMethods[request.Request](TM, request));
                            try
                            {
                                response = TM.GetResult<JsonObject>();
                            }
                            catch (Exception ex)
                            {
                                response = new ErrorResponse("An exception occurred: {0}, Stack: {1}", ex.Message, ex.StackTrace);
                            }
                        }
                        else
                        {
                            response = new ErrorResponse("Unknown request type: \"{0}\"", request.Request);
                        }
                    }
                    else
                    {
                        response = new ErrorResponse("Could not parse JSON object");
                    }
                    byte[] responseBytes = encoder.GetBytes(response.Serialize());
                    stream.Write(responseBytes, 0, responseBytes.Length);
                }
            }

            client.Close();
        }