private void ProcessRequest(Socket client, IPCRequest request)
        {
            byte[] response = new byte[4];
            try
            {

                if (string.Compare(request.Method, "CancelObserveObject", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    string instanceID = request.ReadString();
                    bool useReset = request.ReadBoolean();
                    _ServerAPI.CancelObserveObject(clientID, objectDefinitionID, instanceID, useReset);
                }
                else if (string.Compare(request.Method, "CancelObserveObjectProperty", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    string instanceID = request.ReadString();
                    Guid propertyDefinitionID = request.ReadGuid();
                    bool useReset = request.ReadBoolean();
                    _ServerAPI.CancelObserveObjectProperty(clientID, objectDefinitionID, instanceID, propertyDefinitionID, useReset);
                }
                else if (string.Compare(request.Method, "CancelObserveObjects", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    bool useReset = request.ReadBoolean();
                    _ServerAPI.CancelObserveObjects(clientID, objectDefinitionID, useReset);
                }
                else if (string.Compare(request.Method, "DeleteClient", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    _ServerAPI.DeleteClient(clientID);
                }
                else if (string.Compare(request.Method, "ExecuteResource", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    string instanceID = request.ReadString();
                    Guid propertyDefinitionID = request.ReadGuid();
                    bool success = _ServerAPI.ExecuteResource(clientID, objectDefinitionID, instanceID, propertyDefinitionID);
                    MemoryStream data = new MemoryStream(4096);
                    data.Position = 4;
                    IPCHelper.Write(data, success);
                    data.Position = 0;
                    NetworkByteOrderConverter.WriteInt32(data, (int)data.Length - 4);
                    response = data.ToArray();
                }
                if (string.Compare(request.Method, "GetClients", true) == 0)
                {
                    List<Client> clients = _ServerAPI.GetClients();
                    if (clients != null)
                    {
                        MemoryStream data = new MemoryStream(4096);
                        data.Position = 4;
                        IPCHelper.Write(data, clients.Count);
                        foreach (Client item in clients)
                        {
                            item.Serialise(data);
                        }
                        data.Position = 0;
                        NetworkByteOrderConverter.WriteInt32(data, (int)data.Length - 4);
                        response = data.ToArray();
                    }
                }
                else if (string.Compare(request.Method, "GetDeviceConnectedStatus", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    DeviceConnectedStatus responseObject = _ServerAPI.GetDeviceConnectedStatus(clientID);
                    if (responseObject != null)
                    {
                        MemoryStream data = new MemoryStream(4096);
                        data.Position = 4;
                        responseObject.Serialise(data);
                        data.Position = 0;
                        NetworkByteOrderConverter.WriteInt32(data, (int)data.Length - 4);
                        response = data.ToArray();
                    }
                }
                else if (string.Compare(request.Method, "GetObject", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    string instanceID = request.ReadString();
                    Model.Object responseObject = _ServerAPI.GetObject(clientID, objectDefinitionID, instanceID);
                    if (responseObject != null)
                    {
                        MemoryStream data = new MemoryStream(4096);
                        data.Position = 4;
                        responseObject.Serialise(data);
                        data.Position = 0;
                        NetworkByteOrderConverter.WriteInt32(data, (int)data.Length - 4);
                        response = data.ToArray();
                    }
                }
                else if (string.Compare(request.Method, "GetObjectProperty", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    string instanceID = request.ReadString();
                    Guid propertyDefinitionID= request.ReadGuid();
                    Property responseProperty = _ServerAPI.GetObjectProperty(clientID, objectDefinitionID, instanceID, propertyDefinitionID);
                    if (responseProperty != null)
                    {
                        MemoryStream data = new MemoryStream(4096);
                        data.Position = 4;
                        responseProperty.Serialise(data);
                        data.Position = 0;
                        NetworkByteOrderConverter.WriteInt32(data, (int)data.Length - 4);
                        response = data.ToArray();
                    }
                }
                else if (string.Compare(request.Method, "GetObjects", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    List<Model.Object> responseObjects = _ServerAPI.GetObjects(clientID, objectDefinitionID);
                    if (responseObjects != null)
                    {
                        MemoryStream data = new MemoryStream(4096);
                        data.Position = 4;
                        foreach (Model.Object responseObject in responseObjects)
                        {
                            responseObject.Serialise(data);
                        }
                        data.Position = 0;
                        NetworkByteOrderConverter.WriteInt32(data, (int)data.Length - 4);
                        response = data.ToArray();
                    }
                }
                else if (string.Compare(request.Method, "ObserveObject", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    string instanceID = request.ReadString();
                    _ServerAPI.ObserveObject(clientID, objectDefinitionID, instanceID);
                }
                else if (string.Compare(request.Method, "ObserveObjectProperty", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    string instanceID = request.ReadString();
                    Guid propertyDefinitionID = request.ReadGuid();
                    _ServerAPI.ObserveObjectProperty(clientID, objectDefinitionID, instanceID, propertyDefinitionID);
                }
                else if (string.Compare(request.Method, "ObserveObjects", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    _ServerAPI.ObserveObjects(clientID, objectDefinitionID);
                }
                else if (string.Compare(request.Method, "SaveObject", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Model.Object item = Model.Object.Deserialise(request.Payload);
                    TObjectState state = (TObjectState)request.ReadInt32();
                    string responseID = _ServerAPI.SaveObject(clientID, item, state);
                    if (responseID != null)
                    {
                        MemoryStream data = new MemoryStream(4096);
                        byte[] buffer = Encoding.UTF8.GetBytes(responseID);
                        NetworkByteOrderConverter.WriteInt32(data, (int)(buffer.Length + 4));
                        NetworkByteOrderConverter.WriteInt32(data, buffer.Length);
                        data.Write(buffer, 0, buffer.Length);
                        response = data.ToArray();
                    }
                }
                else if (string.Compare(request.Method, "SaveObjectProperty", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    string instanceID = request.ReadString();
                    Property property = Property.Deserialise(request.Payload);
                    TObjectState state = (TObjectState)request.ReadInt32();
                    _ServerAPI.SaveObjectProperty(clientID, objectDefinitionID, instanceID, property, state);
                }
                else if (string.Compare(request.Method, "SetDataFormat", true) == 0)
                {
                    TDataFormat dataFormat = (TDataFormat)request.ReadInt32();
                    _ServerAPI.SetDataFormat(dataFormat);
                }
                else if (string.Compare(request.Method, "SetNotificationParameters", true) == 0)
                {
                    Guid clientID = request.ReadGuid();
                    Guid objectDefinitionID = request.ReadGuid();
                    string instanceID = request.ReadString();
                    Guid propertyDefinitionID = request.ReadGuid();
                    NotificationParameters notificationParameters = NotificationParameters.Deserialise(request.Payload);
                    bool success = _ServerAPI.SetNotificationParameters(clientID, objectDefinitionID, instanceID, propertyDefinitionID, notificationParameters);
                    MemoryStream data = new MemoryStream(4096);
                    data.Position = 4;
                    IPCHelper.Write(data, success);
                    data.Position = 0;
                    NetworkByteOrderConverter.WriteInt32(data, (int)data.Length - 4);
                    response = data.ToArray();
                }
            }
            catch (Exception ex)
            {
                MemoryStream data = new MemoryStream(4096);
                data.Position = 4;
                IPCHelper.Write(data, ex.GetType().AssemblyQualifiedName);
                IPCHelper.Write(data, ex.Message);
                data.Position = 0;
                NetworkByteOrderConverter.WriteInt32(data, -((int)data.Length - 4));
                response = data.ToArray();
            }
            client.Send(response,SocketFlags.None);
        }